首頁 > 軟體

FreeRTOS實時作業系統的任務建立和刪除

2022-04-06 22:00:09

前言 

在FreeRTOS移植到Cortex-M3硬體平臺的文章中,我們已經見過任務建立API,但那篇文章的重點在於如何移植FreeRTOS,本文將重點放在任務的建立和刪除API函數上面。

任務建立和刪除API函數位於檔案task.c中,需要包含task.h標頭檔案。

1.任務建立

1.1函數描述

                   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()函數具有更大的靈活性。

1.2引數描述

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),建立任務後可以使用這個控制程式碼參照任務。

1.3返回值

&&如果任務成功建立並加入就緒列表函數返回pdPASS,否則函數返回錯誤碼,具體參見projdefs.h。

1.4用法舉例

/* 建立任務. */
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 );
    }
}

2.任務刪除

2.1任務描述

voidvTaskDelete( TaskHandle_t xTask );

從RTOS核心管理器中刪除一個任務。任務刪除後將會從就緒、阻塞、暫停和事件列表中移除。在檔案FreeRTOSConfig.h中,必須定義宏INCLUDE_vTaskDelete 為1,本函數才有效。

注:被刪除的任務,其在任務建立時由核心分配的儲存空間,會由空閒任務釋放。如果有應用程式呼叫xTaskDelete(),必須保證空閒任務獲取一定的微控制器處理時間。任務程式碼自己分配的記憶體是不會自動釋放的,因此刪除任務前,應該將這些記憶體釋放。

2.2引數描述

xTask:被刪除任務的控制程式碼。為NULL表示刪除當前任務。

以上就是FreeRTOS實時作業系統的任務建立和刪除的詳細內容,更多關於FreeRTOS任務建立和刪除的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com