1. 程式人生 > >FreeRTOS任務建立函式“xTaskCreate”分析

FreeRTOS任務建立函式“xTaskCreate”分析

  1. 先從函式的原型討論其各形式引數的意義

​#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),任務建立成功後我們可以通過這個控制代碼引用任務。

  1. 函式實現功能分析

  2. 返回值意義說明