xTaskCreate 任務(wù)創(chuàng)建 API 函數(shù)

2018-07-22 14:30 更新

xTaskCreate

函數(shù)名 :xTaskCreate 頭文件 :task.h 函數(shù)功能:任務(wù)創(chuàng)建 函數(shù)聲明:

portBASE_TYPE xTaskCreate(
pdTASK_CODE pvTaskCode,
const portCHAR * const pcName,
unsigned portSHORT usStackDepth,
void *pvParameters,
unsigned portBASE_TYPE uxPriority,
xTaskHandle *pvCreatedTask
);

如果使用FreeRTOS-MPU,建議使用 xTaskCreateRestricted()來替換xTaskCreate()。 在FreeRTOS-MPU 下使用xTaskCreate(),允許任務(wù)被創(chuàng)建于運(yùn)行在特權(quán)模式或者用戶模式。(見uxPriority 的描述)。特權(quán)模式下,可以利用任務(wù)訪問整個(gè)存儲(chǔ)器空間,用戶模式下,任務(wù)只能訪問自己的堆棧。在兩種情況下,MPU 不會(huì)自動(dòng)捕獲堆棧溢出,雖然標(biāo)準(zhǔn)的FRTOS堆棧溢出檢測方案依然可以使用。xTaskCreateRestricted() 允許了更大的靈活性。 【具體參數(shù)】 pvTaskCode :指向任務(wù)函數(shù)。任務(wù)必須以永不返回的形式實(shí)現(xiàn)(比如一個(gè)死循環(huán))。筆者注釋:這個(gè)參數(shù)即任務(wù)函數(shù)的函數(shù)名,見下文描述。 pcName : 任務(wù)函數(shù)的別名,僅僅是方便調(diào)試所用。最大的長度由configMAX_TASK_NAME_LEN定義。 usStackDepth :任務(wù)堆棧的深度,定義了堆??梢园淖兞繑?shù)——不是字節(jié)數(shù)。比如如果堆棧的寬度為16BIT,而 usStackDepth定義為100,則200 字節(jié)被分配給堆棧存儲(chǔ)。堆棧深度乘以堆棧寬度的最大值,不能超過 size_t變量能包含的最大值。(筆者注釋:堆棧到底應(yīng)該定義多大,大體要考慮到:

  1. 最大級(jí)別中斷嵌套需要的堆棧;
  2. 由于RTOS 生成每個(gè)任務(wù),該任務(wù)天生需要的堆棧,F(xiàn)RTOS至少是16個(gè)字節(jié),隨著翻譯深入會(huì)確認(rèn)這個(gè)問題;
  3. 在每個(gè)任務(wù)函數(shù)中定義局部變量而產(chǎn)生的任務(wù)函數(shù)的變量堆棧。3者相加即為一個(gè)合適的堆棧。)

pvParameters :作為參數(shù)的指針,當(dāng)任務(wù)創(chuàng)建時(shí)。 uxPriority :任務(wù)的優(yōu)先級(jí)。包括MPU支持的系統(tǒng)可以選擇在特權(quán)模式(系統(tǒng)模式)創(chuàng)建任務(wù),通過設(shè)置優(yōu)先級(jí)參數(shù)的portPRIVILEGE_BIT位。比如,創(chuàng)建一個(gè)特權(quán)任務(wù)在優(yōu)先級(jí)2,則uxPriority 應(yīng)當(dāng)設(shè)置為( 2 | portPRIVILEGE_BIT )。 pvCreatedTask :回傳一個(gè)句柄,以便創(chuàng)建的任務(wù)可以被關(guān)聯(lián)。返回值:pdPASS,如果任務(wù)成功創(chuàng)建且添加到就緒列表,否則返回一個(gè)錯(cuò)誤代碼,見 projdefs.h。 范例:

void vTaskCode( void * pvParameters )//創(chuàng)建的任務(wù)
{
    //如果有初使化,放在死循環(huán)之前
    for( ;; ) //一個(gè)死循環(huán)
    {
     //任務(wù)代碼
    }
}
//此函數(shù)創(chuàng)建一個(gè)任務(wù)
void vOtherFunction( void )
{
    static unsigned char ucParameterToPass;
    xTaskHandle xHandle;
    /*
    創(chuàng)建任務(wù),存儲(chǔ)句柄,注意傳遞的參數(shù) ucParameterToPass必須在任務(wù)生存周期內(nèi)存在,
    故在此例子的情況下定義為局部靜態(tài)變量。如果它只是一個(gè)自動(dòng)堆棧變量(局部變量),它可能不再存在或者至少崩潰了,當(dāng)新的任務(wù)試圖訪問時(shí)。
    筆者注釋:由于該任務(wù)一建立就在同一個(gè)函數(shù)中被刪除了,大可以用些局部靜態(tài)變量和局部變量,如果不是在一個(gè)函數(shù)中刪除之前創(chuàng)建的任務(wù),以上參數(shù)請用全局變量。
    */
    xTaskCreate( vTaskCode, "NAME", STACK_SIZE, &ucParameterToPass,
    tskIDLE_PRIORITY, &xHandle );
    //使用句柄刪除任務(wù)。
    vTaskDelete( xHandle );
}
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)