FreeRTOS之xTaskCreateStatic()

xTaskCreateStatic()函數解析

task. h

 BaseType_t xTaskCreate(    TaskFunction_t pvTaskCode,
                            const char * const pcName,
                            configSTACK_DEPTH_TYPE usStackDepth,
                            void *pvParameters,
                            UBaseType_t uxPriority,
                            TaskHandle_t *pxCreatedTask
                          );

總結

創建新的任務實例。
每個任務都需要RAM來保存任務狀態(任務控制塊,或TCB),並被任務用作其堆棧。如果任務是使用xTaskCreate()創建的,則需要從FreeRTOS的堆中自動分配RAM。如果使用xTaskCreateStatic()創建任務,則由應用程序編寫器提供RAM,這將導致兩個額外的函數參數,但允許在編譯時靜態分配RAM。
新創建的任務最初處於就緒狀態,但如果沒有更高優先級的任務可以運行,則會立即成爲正在運行的狀態任務。
創建任務可以在啓動調度程序之前和之後。

參數

參數 功能
pvTaskCode 任務是簡單的C函數,永遠不會退出,因此,通常被實現爲一個無限循環。pvTaskCode參數只是一個指針,指向實現任務的函數(實際上就是函數名)。
pcName 任務的描述性名稱。這主要用於方便調試,但也可以用於調用xTaskGetHandle()來獲得任務句柄。應用程序定義的常量configMAX_TASK_NAME_LEN以字符定義名稱的最大長度—包括空終止符。提供的字符串長度超過這個最大值將導致字符串被自動截斷。
ulStackDepth puxStackBuffer參數用於將StackType_t變量數組傳遞給xTaskCreateStatic()。ulStackDepth必須設置爲數組中索引的數量。
pvParameters 任務函數接受類型爲“指針指向void”(void*)的參數。分配給pvParameters的值將是傳遞給任務的值。此參數具有類型“指針指向void”,以允許任務參數有效地、間接地通過強制轉換接收任何類型的參數。例如,可以將整數類型傳遞到任務函數中,方法是在任務創建時將該整數類型轉換爲void指針,然後將void指針參數轉換回任務函數定義本身中的整數。
uxPriority 定義任務執行的優先級。優先級可以從0(最低優先級)分配到(configMAX_PRIORITIES - 1)(最高優先級)。configMAX_PRIORITIES是一個用戶定義的常量。如果configUSE_PORT_OPTIMISED_TASK_SELECTION設置爲0然後沒有上限的優先級數量可用(除了使用的數據類型的極限和可用的RAM單片機),但建議使用所需的最低數量的優先級,以避免浪費內存。傳遞上面的uxPriority值(configMAX_PRIORITIES - 1)將導致分配給任務的優先級被靜默封頂爲最大合法值。
puxStackBuffer 必須指向至少具有ulStackDepth索引的StackType_t變量數組(請參閱上面的ulStackDepth參數)。數組將被用作已創建任務的堆棧,因此必須是持久的(不能在函數創建的堆棧框架中聲明,也不能在任何其他可以在應用程序執行時合法覆蓋的內存中聲明)。
pxTaskBuffer 必須指向類型爲StaticTask_t的變量。該變量將用於保存創建的任務的數據結構(TCB),因此它必須是持久的(不是在函數創建的堆棧框架中聲明的,也不是在應用程序執行時可以合法覆蓋的任何其他內存中聲明的)。

返回值

返回值 意義
None 無法創建任務,因爲puxStackBuffer或pxTaskBuffer爲空
Any other value 如果返回一個非空值,則創建任務,返回的值是創建的任務的句柄。

使用例程

/* Task to be created. */
void vTaskCode( void * pvParameters )
{
    /* The parameter value is expected to be 1 as 1 is passed in the
    pvParameters value in the call to xTaskCreate() below. 
    configASSERT( ( ( uint32_t ) pvParameters ) == 1 );

    for( ;; )
    {
        /* Task code goes here. */
    }
}

/* Function that creates a task. */
void vOtherFunction( void )
{
BaseType_t xReturned;
TaskHandle_t xHandle = NULL;

    /* Create the task, storing the handle. */
    xReturned = xTaskCreate(
                    vTaskCode,       /* Function that implements the task. */
                    "NAME",          /* Text name for the task. */
                    STACK_SIZE,      /* Stack size in words, not bytes. */
                    ( void * ) 1,    /* Parameter passed into the task. */
                    tskIDLE_PRIORITY,/* Priority at which the task is created. */
                    &xHandle );      /* Used to pass out the created task's handle. */

    if( xReturned == pdPASS )
    {
        /* The task was created.  Use the task's handle to delete the task. */
        vTaskDelete( xHandle );
    }
}

說明

在FreeRTOSConfig.h中,configSUPPORT_DYNAMIC_ALLOCATION必須設置爲1(支持動態內存申請),或者簡單地未定義,使這個函數可用。

Freertos更多精彩

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章