FreeRTOS學習筆記5-靜態方式創建任務函數
配置完成後的進行任務創建,使用靜態方式創建任務時需要使將宏 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-靜態方式創建任務函數