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);