Hôm nay mình giới thiệu RTOS Cho STM32F4 dùng thư viện tiêu chuẩn
Đầu tiên các bạn tải thư viện https://www.freertos.org/
Các bạn copy thư viện đến thư mục và đường dẫn đến keil
Sau đó add vào project như sau :
Sau đó add thêm thư viện hàm main.c
Chương trình với F103
#include "FreeRTOS.h"
#include "task.h"
Thêm 2 thư viện để gọi hàm RTOS
Bắt đầu với RTOS
include "stm32f10x.h" #include "stm32f10x_rcc.h" #include "stm32f10x_gpio.h" #include "FreeRTOS/include/FreeRTOS.h" #include "FreeRTOS/include/task.h" void ledInit(void); // RTOS task void vTaskLedRed(void *p); void vTaskLedYellow(void *p); void vTaskLedGreen(void *p); int main(void) { // Configure GPIO for LED ledInit(); // Create LED blink task xTaskCreate(vTaskLedRed, (const char*) "Red LED Blink", 128, NULL, 1, NULL); xTaskCreate(vTaskLedYellow, (const char*) "Yellow LED Blink", 128, NULL, 1, NULL); xTaskCreate(vTaskLedGreen, (const char*) "Green LED Blink", 128, NULL, 1, NULL); // Start RTOS scheduler vTaskStartScheduler(); return 0; } void ledInit() { GPIO_InitTypeDef GPIO_InitStruct; // Configure PC13, PC14, PC15 as push-pull output RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOC, &GPIO_InitStruct); } void vTaskLedRed(void *p) { for (;;) { GPIOC->ODR ^= GPIO_Pin_14; vTaskDelay(100/portTICK_RATE_MS); } } void vTaskLedYellow(void *p) { for (;;) { GPIOC->ODR ^= GPIO_Pin_15; vTaskDelay(500/portTICK_RATE_MS); } } void vTaskLedGreen(void *p) { for (;;) { GPIOC->ODR ^= GPIO_Pin_13; vTaskDelay(1000/portTICK_RATE_MS); } }
Chương trình với STM32F4
#include "stm32f4xx.h" #include "usart.h" #include "config.h" #include <stdlib.h> #include "systick.h" #include "config_int.h" #include "fuction_code.h" #include "mbconfig.h" #include "port.h" #include "mb.h" #include "mbport.h" #include "mbutils.h" #include "FreeRTOS.h" #include "task.h" static void Task_main(void *pvParameters); static void Task_Spi_IO(void *pvParameters); xTaskHandle Task_main_PRIORITY,Task_Interface_pid_PRIORITY; /* ----------------------- Static variables ---------------------------------*/ static void Task_Spi_IO(void *pvParameters) { pvParameters = pvParameters; while(1) { //chạy chương trình vTaskDelay(1); } } static void Task_game_pad(void *pvParameters) { pvParameters = pvParameters; while(1) { //chạy chương trình vTaskDelay(2); } } static void Task_doc_adc(void *pvParameters) { pvParameters = pvParameters; while(1) { //chạy chương trình vTaskDelay(5); } } static void TaskLCD(void *pvParameters) { for(;;) { //chạy chương trình vTaskDelay(1); } } static void Task_main(void *pvParameters) { pvParameters = pvParameters; for(;;) { //chạy chương trình vTaskDelay(1); } } int main(void) { xTaskCreate(Task_Spi_IO, NULL, 256, NULL, tskIDLE_PRIORITY+1, NULL); xTaskCreate(Task_doc_adc, NULL, 256, NULL, tskIDLE_PRIORITY+1, NULL); xTaskCreate(Task_game_pad, NULL, 256, NULL, tskIDLE_PRIORITY+1, NULL); xTaskCreate(TaskLCD, (signed char*)"TaskLCD", 128, NULL, tskIDLE_PRIORITY, NULL); xTaskCreate(Task_main, (signed char*)"Task_main", 512, NULL, tskIDLE_PRIORITY+1, &Task_main_PRIORITY); vTaskStartScheduler();// lenh nay cho phep cac tac vu da nhiem hoat dong. /* Infinite loop */ while (1) { // } } } Liên hệ linhkienhdshop.com để được hỗ trợ tốt nhất