FreeRTOS 任務管理之任務創建

FreeRTOS 任務管理之任務創建

任務概念

任務:個人感覺就是將相關的一系列操作放在一個任務函數裏來,跟線程差不多一個概念。

任務創建

在FreeRTOS中,任務創建是由任務創建函數來執行,任務創建函數原型如下:

#define xTaskCreate( pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxCreatedTask ) xTaskGenericCreate( ( pvTaskCode ), ( pcName ), ( usStackDepth ), ( pvParameters ), ( uxPriority ), ( pxCreatedTask ), ( NULL ), ( NULL ) )
BaseType_t xTaskGenericCreate( TaskFunction_t pxTaskCode, 
                            const char * const pcName, 
                            const uint16_t usStackDepth, 
                            void * const pvParameters, 
                            UBaseType_t uxPriority, 
                            TaskHandle_t * const pxCreatedTask,
                            StackType_t * const puxStackBuffer, 
                            const MemoryRegion_t * const xRegions );

我們平時調用的是xTaskCreate()這個API,而其實這個API是個參數宏,其實際函數xTaskBenericCreate();在這裏就置分析xTaskCreate()的參數;

  • pvTaskCode,這個是一個指向任務函數的指針,類型爲:TaskFunction_t–void (TaskFunction_t)( void ),也就是說這是一個指向無返回值人口參數爲指針 函數的函數指針。從這裏就引出來了 任務函數一說,任務函數原型爲:
void (*TaskFunction_t)( void * );

舉個例子,一個閃燈的任務函數如下:

static void vLEDTask( void *pvParameters )  
    {  
        while(1)
        {
            LED_Toggle(GREEN_LED_Toggle);
            printf("LED Toggle\n");
            Delay(1000);
        }
    }
  • pcName,這個是任務的描述性名字,這個並沒有多大的作用,只是方便用於調試程序,該字段的長度由FreeRTOSConfig.h中configMAX_TASK_NAME_LEN來決定。
  • usStackDepth,當創建任務時,內核會爲每個任務分配自己的堆棧空間,該參數告訴內核該分配多少堆棧給該任務;當MCU爲STM32時,該參數的內存單位不是字節,而是uint32_t爲單位,四個字節爲單位,代碼中如下:
#define portSTACK_TYPE  uint32_t
  • pvParameters, 任務函數接受一個指向 void 的指針(void*)。pvParameters 的值即
    是傳遞到任務中的值。
  • uxPriority,任務執行的優先級;優先級從0到(configMAX_PRIORITIES-1),0爲最低優先級,數字越大優先級越高;
  • pxCreatedTask, pxCreatedTask 用於傳出任務的句柄。這個句柄將在 API 調用中對
    該創建出來的任務進行引用,比如改變任務優先級,或者刪除任務。
    如果應用程序中不會用到這個任務的句柄,則 pxCreatedTask 可以
    被設爲 NULL。

最後,我們來創建上面閃燈的任務:

xTaskCreate(vLEDTask, 
            "vLEDTASK", 
            512, 
            NULL, 
            1, 
            NULL);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章