1. 程式人生 > >FreeRTOS學習筆記5-靜態方式創建任務函數

FreeRTOS學習筆記5-靜態方式創建任務函數

api函數 depth 還需要 而不是 ica alloc nbsp 分配 類型

配置完成後的進行任務創建,使用靜態方式創建任務時需要使將宏 configSUPPORT_STATIC_ALLOCATION設置為 1,即使用靜態內存。還需要將函數

vApplicationGetIdleTaskMemory()和 ApplicationGetTimerTaskMemory()進行實現。通過這兩個函數來給空閑任務 和定時器服的任務堆 棧和任務控制塊分配內存。在maiinc.c中進行定義。定義靜態的任務堆棧和任務控制塊內存,然後將這些內存傳遞給函數參數。最後創建空閑任務和定時器任務的API函數會調用這兩個函數。

這兩個函數我們在mainc.c中定義:

//空閑任務任務堆棧

static StackType_t IdleTaskStack[configMINIMAL_STACK_SIZE];

//空閑任務控制塊 static StaticTask_t IdleTaskTCB;

//定時器服務任務堆棧

static StackType_t TimerTaskStack[configTIMER_TASK_STACK_DEPTH];

//定時器服務任務控制塊

static StaticTask_t TimerTaskTCB;

//獲取空閑任務地堆棧和控制塊內存,因為本例程使用的

//靜態內存,因此空閑任務的堆棧和控制塊就應該 靜態內存,因此空閑任務的堆棧和控制塊就應該

//有用戶來提供, 有用戶來提供, FreeRTOS提供了接口函數 vApplicationGetIdleTaskMemory()

//實現此函數即可。 實現此函數即可。

//ppxIdleTaskTCBBuffer:任務控制塊內存

//ppxIdleTaskStackBuffer:任務堆棧內存

//pulIdleTaskStackSize:任務堆棧大小

void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer,

                  StackType_t **ppxIdleTaskStackBuffer,

                   uint32_t *pulIdleTaskStackSize)

{

*ppxIdleTaskTCBBuffer=&IdleTaskTCB;

*ppxIdleTaskStackBuffer=IdleTaskStack;

*pulIdleTaskStackSize=configMINIMAL_STACK_SIZE;

}

//獲取定時器服務任的堆棧和控制塊內存

//ppxTimerTaskTCBBuffer:任務控制塊內存 //ppxTimerTaskStackBuffer:任務堆棧內存

//pulTimerTaskStackSize:任務堆棧大小 任務堆棧大小

void vApplicationGetTimerTaskMemory(StaticTask_t **ppxTimerTaskTCBBuffer,

                   StackType_t **ppxTimerTaskStackBuffer,

                    uint32_t *pulTimerTaskStackSize)

{

  *ppxTimerTaskTCBBuffer=&TimerTaskTCB;

  *ppxTimerTaskStackBuffer=TimerTaskStack;              

  *pulTimerTaskStackSize=configTIMER_TASK_STACK_DEPTH;

}

註:定義任務控制塊時,類型要用StaticTask_t,而不是TCB_t或tskTCB

xTaskCreateStatic()和 xTaskCreate()沒有太大的區別。大部分是相同的。創建任務的過程中。還是使用動態的方式更為簡單。靜態的方式了解一下即可。需要使用時再深入研究。

FreeRTOS學習筆記5-靜態方式創建任務函數