1. 程式人生 > 實用技巧 >7-FreeRTOS時間片進行任務排程

7-FreeRTOS時間片進行任務排程

程式碼:

 //----------------------------------------任務優先順序
 #define START_TASK_PRIO     1 
 #define KEY_TASK_PRIO       2
 #define TASK1_PRIO          2 
 #define TASK2_PRIO          2 //優先順序高
 
 
 //----------------------------------------任務堆疊大小
 #define START_STK_SIZE 128 
 #define TASK1_STK_SIZE 128 
 #define
TASK2_STK_SIZE 128 #define KEY_STK_SIZE 128 //----------------------------------------任務控制代碼 TaskHandle_t Task1_Handler; TaskHandle_t Task2_Handler; TaskHandle_t StartTask_Handler; TaskHandle_t KeyTask_Handler; //任務控制代碼 //----------------------------------------任務函式 void start_task(void
*pvParameters); void task1_task(void *pvParameters); void task2_task(void *pvParameters); void key_task(void *pvParameters); //任務函式 int main(void) { BaseType_t OS; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); User_GPIO_Init(); Delay_init(); USART_Config(); OS
= xTaskCreate( (TaskFunction_t ) start_task, //任務函式 (const char * ) "start_task", //任務名 (configSTACK_DEPTH_TYPE) START_STK_SIZE, //堆疊大小 (void * )NULL, //傳遞給任務函式的引數 (UBaseType_t ) START_TASK_PRIO, //任務優先順序 (TaskHandle_t * ) &StartTask_Handler //任務控制代碼 ); if(OS==pdPASS) GPIO_SetBits(GPIOA, GPIO_Pin_8); vTaskStartScheduler(); //開啟任務排程 } void start_task(void *pvParameters) { taskENTER_CRITICAL(); //進入臨界區 //建立任務Task1 xTaskCreate((TaskFunction_t )task1_task, //任務函式 (const char* )"task1_task", //任務名稱 (uint16_t )TASK1_STK_SIZE, //任務堆疊大小 (void* )NULL, (UBaseType_t )TASK1_PRIO, //任務優先順序 (TaskHandle_t* )&Task1_Handler); //任務控制代碼 xTaskCreate((TaskFunction_t )task2_task, //任務函式 (const char* )"task2_task", //任務名稱 (uint16_t )TASK2_STK_SIZE, //任務堆疊大小 (void* )NULL, (UBaseType_t )TASK2_PRIO, //任務優先順序 (TaskHandle_t* )&Task2_Handler); //任務控制代碼 vTaskDelete(StartTask_Handler); //vTaskDelete(NULL)也可以 刪除開始任務 taskEXIT_CRITICAL(); //退出臨界區 } //任務1 void task1_task(void *pvParameters) { uint8_t count_num=0; while(1) { count_num++; printf("任務1已經執行:%d次\r\n",count_num); delay_xms(25); //vTaskDelay delay_xms不發生任務切換 } } //任務2 void task2_task(void *pvParameters) { uint8_t count_num1=0; while(1) { count_num1++; printf("任務2已經執行:%d次\r\n",count_num1); delay_xms(25); //configTICK_RATE_HZ 10則時間片是100ms 這裡延時25ms,則每個任務基本上執行4次會切換任務 } }