4-FreeRTOS 靜態任務的建立/刪除
阿新 • • 發佈:2020-12-19
需求:靜態建立任務(任務堆疊、控制塊由使用者自己指定)
①用一個任務建立兩個任務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 }
執行結果: