FreeRTOS任務建立函式“xTaskCreate”分析
-
先從函式的原型討論其各形式引數的意義
#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, const char * const pcName, const uint16_t usStackDepth, void * const pvParameters, UBaseType_t uxPriority, TaskHandle_t * const pxCreatedTask ) { ... } #endif /* configSUPPORT_DYNAMIC_ALLOCATION */
(1). pxTaskCode
其型別TaskFunction_t為typedef定義實現:
/*
* Defines the prototype to which task functions must conform. Defined in this
* file to ensure the type is known before portable.h is included.
*/
typedef void (*TaskFunction_t)( void * );
從上面的定義中可以得到兩個資訊:
a. pxTaskCode是一個函式指標(實際傳參為我們編寫的任務函式),該函式(任務函式)沒有返回值(void),實際上任務函式是一個死迴圈,永遠不會返回;
b. pxTaskCode任務函式的引數為( void * ) , 通常( void * )用在函式引數值(或者返回值)中是為了相容不同指標型別的傳遞。我們可以將別的型別的指標無需強制型別轉換的賦值給void *型別。也可以將void *強制型別轉換成任何別的指標型別,至於強轉的型別是否合理,就需要我們程式設計師自己控制了。
(2). pcName
(3). usStackDepth
usStackDepth是指堆疊深度,有一點需要特別注意的是“堆疊深度”是指堆疊單元的數量而不是位元組數。堆疊的位元組數等於堆疊的寬度( sizeof(StackType_t))乘以深度。
StackType_t *pxStack;
/* Allocate space for the stack used by the task being created. */
pxStack = ( StackType_t * ) pvPortMalloc( ( ( ( size_t ) usStackDepth ) * sizeof(
StackType_t ) ) ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */
從上面的呼叫中,可以知道堆疊能分配的最大位元組數為型別size_t能表示的最大數字。如果usStackDepth給得太大,那麼我們將不能如願得到想要長度的堆疊。
typedef portSTACK_TYPE StackType_t;
#define portSTACK_TYPE uint32_t
(4). pvParameters
任務建立時,作為一個引數傳遞給任務。
(5). uxPriority
任務優先順序。
(6). pxCreatedTask
回傳一個任務控制代碼(任務ID),任務建立成功後我們可以通過這個控制代碼引用任務。
-
函式實現功能分析
-
返回值意義說明