配置完成后的进行任务创建,使用静态方式创建任务时需要使将宏 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()没有太大的区别。大部分是相同的。创建任务的过程中。还是使用动态的方式更为简单。静态的方式了解一下即可。需要使用时再深入研究。