(一)創建與刪除任務函數
(二)上面的四個函數目前只用動態創建任務和刪除任務
(三)動態創建任務 函數 xTaxkCreate()
1. 宏 configSUPPORT_DYNAMIC_ALLOCATION 必須為 1
2. 新創建的任務默認就是就緒態的,如果當前沒有比它更高優先級的任務運行那么此任務就會立即進入運行態開始運行,不管在任務調度器啟動前還是啟動后,都可以創建任務
3. 函數原型
BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, const char * const pcName, const uint16_t usStackDepth, void * const pvParameters, UBaseType_t uxPriority, TaskHandle_t * const pxCreatedTask )
參數:
pxTaskCode: 任務函數。
pcName: 任務名字,一般用於追蹤和調試,任務名字長度不能超過。configMAX_TASK_NAME_LEN。
usStackDepth : 任務堆棧大小,注意實際申請到的堆棧是 usStackDepth 的 4 倍。其中空閑任務的任務堆棧大小為 configMINIMAL_STACK_SIZE。
pvParameters: 傳遞給任務函數的參數。
uxPriotiry: 任務優先級,范圍 0~ configMAX_PRIORITIES-1。
pxCreatedTask: 任務句柄,任務創建成功以后會返回此任務的任務句柄,這個句柄其實就是任務的任務堆棧。此參數就用來保存這個任務句柄。其他 API 函數可能會使用到這個句柄。
返回值:
pdPASS: 任務創建成功。
errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY: 任務創建失敗,因為堆內存不足!
(四)刪除任務數 函數 vTaskDelete()
刪除一個用函數 xTaskCreate()或者 xTaskCreateStatic()創建的任務,被刪除了的任務不再存
在,也就是說再也不會進入運行態。任務被刪除以后就不能再使用此任務的句柄!如果此任務
是使用動態方法創建的,也就是使用函數 xTaskCreate()創建的,那么在此任務被刪除以后此任
務之前申請的堆棧和控制塊內存會在空閑任務中被釋放掉,因此當調用函數 vTaskDelete()刪除
任務以后必須給空閑任務一定的運行時間。
只有那些由內核分配給任務的內存才會在任務被刪除以后自動的釋放掉,用戶分配給任務
的內存需要用戶自行釋放掉,比如某個任務中用戶調用函數 pvPortMalloc()分配了 500 字節的內
存,那么在此任務被刪除以后用戶也必須調用函數 vPortFree()將這 500 字節的內存釋放掉,否
則會導致內存泄露。此函數原型如下:
vTaskDelete( TaskHandle_t xTaskToDelete )
(五)任務創建和刪除實驗(動態方法)
● 任務設置
#define START_TASK_PRIO 1 //任務優先級 (1)
#define START_STK_SIZE 128 //任務堆棧大小 (2) TaskHandle_t StartTask_Handler; //任務句柄 (3)
void start_task(void *pvParameters); //任務函數 (4)
● main()函數
int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//設置系統中斷優先級分組4 delay_init(); //延時函數初始化 uart_init(115200); //初始化串口
//創建開始任務 xTaskCreate((TaskFunction_t )start_task, //任務函數 (const char* )"start_task", //任務名稱 (uint16_t )START_STK_SIZE, //任務堆棧大小 (void* )NULL, //傳遞給任務函數的參數 (UBaseType_t )START_TASK_PRIO, //任務優先級 (TaskHandle_t* )&StartTask_Handler); //任務句柄 vTaskStartScheduler(); //開啟任務調度 }
● 開始任務函數,用來創建其他的任務
//開始任務任務函數 void start_task(void *pvParameters) { taskENTER_CRITICAL(); //進入臨界區 //創建中斷測試任務 xTaskCreate((TaskFunction_t )interrupt_task, //任務函數 (const char* )"interrupt_task", //任務名稱 (uint16_t )INTERRUPT_STK_SIZE, //任務堆棧大小 (void* )NULL, //傳遞給任務函數的參數 (UBaseType_t )INTERRUPT_TASK_PRIO, //任務優先級 (TaskHandle_t* )&INTERRUPTTask_Handler); //任務句柄 vTaskDelete(StartTask_Handler); //刪除開始任務 taskEXIT_CRITICAL(); //退出臨界區 }