目錄
注意:這裏我只是簡單地介紹FreeRTOS任務的創建、刪除等過程,並沒有對源碼進行分析,有興趣的朋友可以深入瞭解一下!
1、任務創建和刪除API函數
1.1、任務創建
1.1.1、動態創建
使用函數 xTaskCreate()來創建任務的話那麼這些所需的 RAM 就會自動的從 FreeRTOS 的堆中分配, 因此必須提供內存管理文件,默認我們使用heap_4.c 這個內存管理文件,而且宏 configSUPPORT_DYNAMIC_ALLOCATION 必須爲 1。
BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, //任務函數
const char * const pcName, //任務名稱
const uint16_t usStackDepth, //堆棧大小 x4
void * const pvParameters, //傳遞函數的參數
UBaseType_t uxPriority, //優先級,範圍0~31
TaskHandle_t * const pxCreatedTask ) //任務句柄,標誌
//返回值:
// pdPASS: 任務創建成功。
// errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY: 任務創建失敗,因爲堆內存不足!
1.1.2、靜態創建
使用此函數創建的任務所需 的 RAM 需 要 用 用 戶 來 提 供 。 如 果 要 使 用 此 函 數 的 話 需 要 將 宏configSUPPORT_STATIC_ALLOCATION 定義爲 1。
TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode, //任務函數
const char * const pcName, //任務名稱
const uint32_t ulStackDepth, //任務堆棧大小,一般是個數組
void * const pvParameters, //傳遞函數的參數
UBaseType_t uxPriority, //優先級,範圍0~31
StackType_t * const puxStackBuffer, //任務堆棧,一般爲數組
//數組類型要爲StackType_t 類型
StaticTask_t * const pxTaskBuffer ) //任務控制塊
//返回值:
// NULL: 任務創建失敗, puxStackBuffer 或 pxTaskBuffer 爲 NULL 的時候會導致這個錯誤的發生。
// 其他值:任務創建成功,返回任務的任務句柄
1.2、任務刪除
刪除後的任務不再存在,也就是不會進入運行狀態,也就不能再使用此任務的任務句,xTaskCreate()創建的,那麼在此任務被刪除以後此任務之前申請的堆棧和控制塊內存會在空閒任務中被釋放掉,因此當調用函數 vTaskDelete()刪除,任務以後必須給空閒任務一定的運行時間,如果是手動分配的就得在任務刪除後手動釋放內存,否則會導致內存泄漏。
//要刪除的任務的任務句柄 無返回值
vTaskDelete( TaskHandle_t xTaskToDelete )
1.3、動態創建與刪除代碼實現:
步驟:
①FreeRTOSConfig.h中宏configSUPPORT_DYNAMIC_ALLOCATION爲1
②調用動態創建任務函數xTaskCreate();(在task.c內)
③開始任務函數vTaskCode()的創建與實現(名字可修改,一般寫爲start_task(),在task.h官方已給出模板)
④聲明、定義、創建開始函數參數
⑤同樣在開始函數內創建其他任務函數
⑥聲明、定義、編寫任務函數
1.4、靜態創建與刪除代碼實現:
步驟
①FreeRTOSConfig.h中,宏configSUPPORT_STATIC_ALLOCATION 定義爲 1,沒有就添加
②編寫空閒任務所需內存函數和定時器所需內存函數
③調用靜態創建任務函數xTaskCreateStatic();(在task.c內)
③開始任務函數vTaskCode()的創建與實現(名字可修改,一般寫爲start_task(),在task.h官方已給出 模板)
④聲明、定義、創建開始函數參數
⑤同樣在開始函數內創建其他任務函數
⑥聲明、定義、編寫任務函數
注意:在我們的一般使用中,最常用的方法是使用動態創建任務函數
2、任務掛起和恢復 API 函數
2.1、任務掛起
此函數用於將某個任務設置爲掛起態, 進入掛起態的任務永遠都不會進入運行態。退出掛起態的唯一方法就是調用任務恢復函數 vTaskResume()或 xTaskResumeFromISR()。函數原型如下:
//xTaskToSuspend參數是任務句柄,可以通過函數 xTaskGetHandle()來根據任務名字來獲取某個任務的任務句柄。
//注意! 如果參數爲 NULL 的話表示掛起任務自己。
void vTaskSuspend( TaskHandle_t xTaskToSuspend)
2.2 任務恢復
將一個任務從掛起態恢復到就緒態, 只有通過函數 vTaskSuspend()設置爲掛起態的任務纔可以使用 vTaskRexume()恢復!函數原型如下:
//xTaskToResume: 任務句柄。
void vTaskResume( TaskHandle_t xTaskToResume)
2.3、中斷恢復
此函數是 vTaskResume()的中斷版本,用於在中斷服務函數中恢復一個任務。函數原型如下:
//xTaskToResume任務句柄
//返回值:
// pdTRUE: 恢復運行的任務的任務優先級等於或者高於正在運行的任務(被中斷打斷的任務), 這意味着在退出中斷服務函數以後必須進行一次任務切換(就是執行一次該任務調度)。
// pdFALSE: 恢復運行的任務的任務優先級低於當前正在運行的任務(被中斷打斷的任務),這意味着在退出中斷服務函數的以後不需要進行任務切換
BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume)