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

4-FreeRTOS 靜態任務的建立/刪除

需求:靜態建立任務(任務堆疊、控制塊由使用者自己指定)

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

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

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

程式碼:

①需要將該巨集開啟:

#define configSUPPORT_STATIC_ALLOCATION 1 //靜態記憶體

如果使用靜態方法 的 話 需 要 用 戶 實 現 兩 個 函 數 vApplicationGetIdleTaskMemory() vApplicationGetTimerTaskMemory()。 通過這兩個函式來給空閒任務和定時器服務任務的任務堆疊和任務控制塊分配記憶體

 1 //空閒任務所需記憶體
 2 void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer,
 3                                     StackType_t ** ppxIdleTaskStackBuffer,
 4                                     uint32_t * pulIdleTaskStackSize )
 5 {
 6     
 7     * ppxIdleTaskTCBBuffer = &IdleTaskTCB;//
空閒任務控制塊 8 * ppxIdleTaskStackBuffer= IdleTaskStack; //空閒任務任務堆疊 9 * pulIdleTaskStackSize = configMINIMAL_STACK_SIZE; //堆疊大小 10 11 } 12 13 14 //定時器任務所需記憶體 15 void vApplicationGetTimerTaskMemory( StaticTask_t ** ppxTimerTaskTCBBuffer, 16 StackType_t ** ppxTimerTaskStackBuffer,
17 uint32_t * pulTimerTaskStackSize ) 18 { 19 20 * ppxTimerTaskTCBBuffer = &TimerTaskTCB;//任務控制塊 21 * ppxTimerTaskStackBuffer= TimerTaskStack; //任務堆疊 22 * pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH; //堆疊大小 23 24 }

②靜態建立過程

  1 //----------------------------------------任務優先順序
  2 #define START_TASK_PRIO 1 
  3 #define TASK1_PRIO 2 
  4 #define TASK2_PRIO 3 //優先順序高
  5 
  6 //----------------------------------------任務堆疊大小
  7 #define START_STK_SIZE 128
  8 #define TASK1_STK_SIZE 128 
  9 #define TASK2_STK_SIZE 128 
 10 
 11 //----------------------------------------任務堆疊
 12 StackType_t StartTaskStack[START_STK_SIZE]; 
 13 StackType_t Task1TaskStack[TASK1_STK_SIZE];
 14 StackType_t Task2TaskStack[TASK2_STK_SIZE];
 15 
 16 //----------------------------------------任務控制塊
 17 StaticTask_t StartTaskTCB; 
 18 StaticTask_t Task1TaskTCB;
 19 StaticTask_t Task2TaskTCB;
 20 
 21 
 22 //----------------------------------------任務控制代碼
 23 TaskHandle_t Task1_Handler; 
 24 TaskHandle_t Task2_Handler; 
 25 TaskHandle_t StartTask_Handler; 
 26 
 27 
 28 //----------------------------------------任務函式
 29 void start_task(void *pvParameters); 
 30 void task1_task(void *pvParameters); 
 31 void task2_task(void *pvParameters); 
 32 
 33 
 34 
 35 //定時器任務所需記憶體
 36 void vApplicationGetTimerTaskMemory( StaticTask_t ** ppxTimerTaskTCBBuffer,
 37                                      StackType_t ** ppxTimerTaskStackBuffer,
 38                                      uint32_t * pulTimerTaskStackSize )
 39 {
 40     
 41     * ppxTimerTaskTCBBuffer = &TimerTaskTCB;//任務控制塊
 42     * ppxTimerTaskStackBuffer= TimerTaskStack; //任務堆疊
 43     * pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH; //堆疊大小
 44   
 45 }
 46 
 47 
 48 
 49 int main(void)
 50 {
 51   User_GPIO_Init();
 52     Delay_init();
 53     USART_Config();
 54     
 55 //    TIM6_Time_Init(9999,7199);//定時1s
 56 //  TIM7_Time_Init(9999,7199);//定時1s
 57 
 58     
 59     StartTask_Handler= xTaskCreateStatic( (TaskFunction_t) start_task,
 60                          (const char * ) "start_task",     
 61                          (uint32_t) START_STK_SIZE,  //任務堆疊大小
 62                          (void * ) NULL,
 63                          (UBaseType_t) START_TASK_PRIO,
 64                          (StackType_t * ) StartTaskStack,
 65                          (StaticTask_t *) &StartTaskTCB);
 66                                  
 67     if(StartTask_Handler==NULL) //建立成功
 68          GPIO_SetBits(GPIOA, GPIO_Pin_8);
 69         
 70     vTaskStartScheduler(); //開啟任務排程
 71     
 72 }
 73 
 74 void start_task( void * pvParameters )
 75 {
 76     taskENTER_CRITICAL(); //進入臨界區
 77     
 78    //建立任務Task1
 79     Task1_Handler= xTaskCreateStatic( (TaskFunction_t ) task1_task,
 80                                          (const char *   ) "task1_task",     
 81                                          (uint32_t       ) TASK1_STK_SIZE,  //任務堆疊大小
 82                                          (void *         ) NULL,
 83                                          (UBaseType_t    ) TASK1_PRIO,
 84                                          (StackType_t   *) Task1TaskStack,
 85                                          (StaticTask_t  *) &Task1TaskTCB );
 86                                          
 87                                          
 88   //建立任務Task2
 89     Task2_Handler= xTaskCreateStatic( (TaskFunction_t) task2_task,
 90                                          (const char   *) "task2_task",     
 91                                          (uint32_t      ) TASK2_STK_SIZE,  //任務堆疊大小
 92                                          (void *        ) NULL,
 93                                          (UBaseType_t   ) TASK2_PRIO,
 94                                          (StackType_t  *) Task2TaskStack,
 95                                          (StaticTask_t *) &Task2TaskTCB );
 96                                          
 97                                          
 98                                                  
 99         vTaskDelete(StartTask_Handler); //vTaskDelete(NULL)也可以   刪除開始任務
100         taskEXIT_CRITICAL();            //退出臨界區                                                 
101 }
102 
103 
104 
105 void task1_task(void *pvParameters)
106 {  
107     uint8_t count_num=0; 
108    
109     while(1)
110     {
111       count_num++;
112         printf("任務1執行:%d次\n", count_num);
113         
114         if(count_num==5) 
115         {
116           vTaskDelete(Task2_Handler);
117             printf("任務2被任務1刪除\n");
118         }            
119         if(count_num==10)  
120         {
121             printf("任務1被刪除\n");
122           vTaskDelete(NULL);  //將自身任務刪除
123             
124         }
125         vTaskDelay(1000);  //延時1000個時鐘節拍,就是1s   configTICK_RATE_HZ
126     }
127         
128 }
129  
130 void task2_task(void *pvParameters)
131 {  
132     uint8_t count_num1=0;
133    while(1)
134    {
135      count_num1++;
136      printf("任務2執行:%d次\n", count_num1);
137          vTaskDelay(1000);
138   }
139 }

執行結果: