FreeRTOS(4)---FreeRTOS 任務建立和刪除
FreeRTOS 任務建立和刪除
FreeRTOS 任務建立和刪除
在FreeRTOS移植到Cortex-M3硬體平臺的文章中,我們已經見過任務建立API,但那篇文章的重點在於如何移植FreeRTOS,本文將重點放在任務的建立和刪除API函式上面。
任務建立和刪除API函式位於檔案task.c中,需要包含task.h標頭檔案。
任務建立
函式描述
BaseType_t xTaskCreate( TaskFunction_t pvTaskCode, const char * const pcName, unsigned short usStackDepth, void *pvParameters, UBaseType_t uxPriority, TaskHandle_t * pvCreatedTask );
建立新的任務並加入任務就緒列表。
如果使用FreeRTOS-MPU(在官方下載包中,為Cortex-M3核心寫了兩個移植方案,一個是普通的FreeRTOS移植層,還有一個是FreeRTOS-MPU移植層。後者包含完整的記憶體保護),那麼推薦使用函式xTaskCreateRestricted()來代替xTaskCreate()。在使用FreeRTOS-MPU的情況下,使用xTaskCreate()函式可以建立執行在特權模式或使用者模式(見下面對函式引數uxPriority的描述)的任務。當執行在特權模式下,任務可以訪問整個記憶體對映;當處於使用者模式下,任務僅能訪問自己的堆疊。無論在何種模式下,MPU都不會自動捕獲堆疊溢位,因此標準的FreeRTOS堆疊溢位檢測機制仍然會被用到。xTaskCreateRestricted()函式具有更大的靈活性。
引數描述
- pvTaskCode:指標,指向任務函式的入口。任務永遠不會返回(位於死迴圈內)。該引數型別TaskFunction_t定義在檔案projdefs.h中,定義為:typedefvoid (*TaskFunction_t)( void * )。
- pcName:任務描述。主要用於除錯。字串的最大長度由巨集configMAX_TASK_NAME_LEN指定,該巨集位於FreeRTOSConfig.h檔案中。
- usStackDepth:指定任務堆疊大小,能夠支援的堆疊變數數量,而不是位元組數。比如,在16位寬度的堆疊下,usStackDepth定義為100,則實際使用200位元組堆疊儲存空間。堆疊的寬度乘以深度必須不超過size_t型別所能表示的最大值。比如,size_t為16位,則可以表示的最大值是65535。
- pvParameters:指標,當任務建立時,作為一個引數傳遞給任務。
- uxPriority:任務的優先順序。具有MPU支援的系統,可以通過置位優先順序引數的portPRIVILEGE_BIT位,隨意的在特權(系統)模式下建立任務。比如,建立一個優先順序為2的特權任務,引數uxPriority可以設定為( 2 | portPRIVILEGE_BIT )。
- pvCreatedTask:用於回傳一個控制代碼(ID),建立任務後可以使用這個控制代碼引用任務。
返回值
如果任務成功建立並加入就緒列表函式返回pdPASS,否則函式返回錯誤碼,具體參見projdefs.h。
用法舉例
/* 建立任務. */
void vTaskCode( void * pvParameters )
{
for( ;; )
{
/* 任務程式碼放在這裡 */
}
}
/* 建立任務函式 */
void vOtherFunction( void )
{
static unsigned char ucParameterToPass;
xTaskHandlexHandle;
/* 建立任務,儲存控制代碼。注:傳遞的引數ucParameterToPass必須和任務具有相同的生存週期,
因此這裡定義為靜態變數。如果它只是一個自動變數,可能不會有太長的生存週期,因為
中斷和高優先順序任務可能會用到它。 */
xTaskCreate( vTaskCode, "NAME", STACK_SIZE,&ucParameterToPass, tskIDLE_PRIORITY, &xHandle );
/* 使用控制代碼刪除任務. */
if( xHandle !=NULL )
{
vTaskDelete( xHandle );
}
}
任務刪除
任務描述
voidvTaskDelete( TaskHandle_t xTask );
從RTOS核心管理器中刪除一個任務。任務刪除後將會從就緒、阻塞、暫停和事件列表中移除。在檔案FreeRTOSConfig.h中,必須定義巨集INCLUDE_vTaskDelete 為1,本函式才有效。
注:被刪除的任務,其在任務建立時由核心分配的儲存空間,會由空閒任務釋放。如果有應用程式呼叫xTaskDelete(),必須保證空閒任務獲取一定的微控制器處理時間。任務程式碼自己分配的記憶體是不會自動釋放的,因此刪除任務前,應該將這些記憶體釋放。
引數描述
- xTask:被刪除任務的控制代碼。為NULL表示刪除當前任務。