1. 程式人生 > >FreeRTOS(4)---FreeRTOS 任務建立和刪除

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表示刪除當前任務。