1. 程式人生 > 實用技巧 >3-FreeRTOS 動態任務建立/刪除

3-FreeRTOS 動態任務建立/刪除

要求:

①用一個任務建立兩個任務Task1和Task2後,將自身任務刪除

②在Task1執行5次後,用Task1將Task2刪除

③Task1執行10次後,將自身刪除

程式碼:

  1 #include "FreeRTOS.h"
  2 #include "task.h"
  3 
  4 
  5 //----------------------------------------任務優先順序
  6 #define START_TASK_PRIO 1 
  7 #define TASK1_PRIO 2 
  8 #define TASK2_PRIO 3 //優先順序高
  9 
 10 //----------------------------------------任務堆疊大小
11 #define START_STK_SIZE 256 12 #define TASK1_STK_SIZE 256 13 #define TASK2_STK_SIZE 256 14 15 16 //----------------------------------------任務控制代碼 17 TaskHandle_t Task1_Handler; 18 TaskHandle_t Task2_Handler; 19 TaskHandle_t StartTask_Handler; 20 21 22 //----------------------------------------任務函式
23 void start_task(void *pvParameters); 24 void task1_task(void *pvParameters); 25 void task2_task(void *pvParameters); 26 27 28 29 int main(void) 30 { 31 BaseType_t OS; 32 33 User_GPIO_Init(); 34 Delay_init(); 35 USART_Config(); 36 37 // TIM6_Time_Init(9999,7199);
//定時1s 38 // TIM7_Time_Init(9999,7199);//定時1s 39 40 41 OS= xTaskCreate( 42 (TaskFunction_t ) start_task, //任務函式 43 (const char * ) "start_task", //任務名 44 (configSTACK_DEPTH_TYPE) START_STK_SIZE, //堆疊大小 45 (void * )NULL, //傳遞給任務函式的引數 46 (UBaseType_t ) START_TASK_PRIO, //任務優先順序 47 (TaskHandle_t * ) &StartTask_Handler //任務控制代碼 48 ); 49 50 if(OS==pdPASS) 51 GPIO_SetBits(GPIOA, GPIO_Pin_8); 52 53 vTaskStartScheduler(); //開啟任務排程 54 55 } 56 57 58 void start_task(void *pvParameters) 59 { 60 61 taskENTER_CRITICAL(); //進入臨界區 62 63 //建立任務Task1 64 xTaskCreate((TaskFunction_t )task1_task, //任務函式 65 (const char* )"task1_task", //任務名稱 66 (uint16_t )TASK1_STK_SIZE, //任務堆疊大小 67 (void* )NULL, 68 (UBaseType_t )TASK1_PRIO, //任務優先順序 69 (TaskHandle_t* )&Task1_Handler); //任務控制代碼 70 71 72 73 //建立任務Task2 74 xTaskCreate((TaskFunction_t )task2_task, //任務函式 75 (const char* )"task2_task", //任務名稱 76 (uint16_t )TASK2_STK_SIZE, //任務堆疊大小 77 (void* )NULL, 78 (UBaseType_t )TASK2_PRIO, //任務優先順序 79 (TaskHandle_t* )&Task2_Handler); //任務控制代碼 80 81 82 vTaskDelete(StartTask_Handler); //vTaskDelete(NULL)也可以 刪除開始任務 83 taskEXIT_CRITICAL(); //退出臨界區 84 } 85 86 87 88 void task1_task(void *pvParameters) 89 { 90 uint8_t count_num=0; 91 92 while(1) 93 { 94 count_num++; 95 printf("任務1執行:%d次\n", count_num); 96 97 if(count_num==5) 98 { 99 vTaskDelete(Task2_Handler); 100 printf("任務2被刪除\n"); 101 } 102 if(count_num==10) 103 { 104 printf("任務1被刪除\n"); 105 vTaskDelete(NULL); //將自身任務刪除 106 107 } 108 vTaskDelay(1000); //延時1000個時鐘節拍,就是1s configTICK_RATE_HZ 109 } 110 111 } 112 113 void task2_task(void *pvParameters) 114 { 115 uint8_t count_num1=0; 116 while(1) 117 { 118 count_num1++; 119 printf("任務2執行:%d次\n", count_num1); 120 vTaskDelay(1000); 121 } 122 }

執行結果:

任務2優先順序大於任務1