freeRTOS 静态创建任务
静态创建任务需要提供任务栈的地址和任务控制块tcb的地址,并且需要实现给空闲函数分配空间的vApplicationGetIdleTaskMemory()函数
1、FreeRTOSConfig.h配置
/* 开启静态分配 */
#define configSUPPORT_STATIC_ALLOCATION 1/* 软件定时器相关定义 */
#define configUSE_TIMERS 1 /* 1: 使能软件定时器, 默认: 0 */
#define configTIMER_TASK_PRIORITY ( configMAX_PRIORITIES - 1 ) /* 定义软件定时器任务的优先级, 无默认configUSE_TIMERS为1时需定义 */
#define configTIMER_QUEUE_LENGTH 5 /* 定义软件定时器命令队列的长度, 无默认configUSE_TIMERS为1时需定义 */
#define configTIMER_TASK_STACK_DEPTH ( configMINIMAL_STACK_SIZE * 2) /* 定义软件定时器任务的栈空间大小, 无默认configUSE_TIMERS为1时需定义 */
2、创建静态任务、启动任务调度器
StackType_t Start_Task_Stack[STACK_SIZE];
StaticTask_t Start_Task_Tcb;
void freertos_start()
{/*1、创建任务*/Start_Task_Handle = xTaskCreateStatic( (TaskFunction_t) startTask,(const char * const) "startTask", (const uint32_t) STACK_SIZE,(void * const) NULL,(UBaseType_t) START_TASK_PRIORITY,(StackType_t * const) Start_Task_Stack,//任务栈地址,数组形式存储(StaticTask_t * const) &Start_Task_Tcb );//tcb地址/*2、启动任务调度器, 会自动创建空闲任务和软件定时器(如果开启)静态创建的方式需要去实现2个分配资源的接口函数*/vTaskStartScheduler();
}
3、实现接口函数
选择静态创建任务,需要实现vApplicationGetIdleTaskMemory();
开启软件定时器需要实现vApplicationGetTimerTaskMemory
StackType_t Idle_Task_Stack[configMINIMAL_STACK_SIZE];
StaticTask_t Idle_Task_Tcb;
/*静态方法创建任务需要实现的函数*/
/*分配空闲任务的资源*/
void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer,StackType_t ** ppxIdleTaskStackBuffer,uint32_t * pulIdleTaskStackSize )
{*ppxIdleTaskTCBBuffer = &Idle_Task_Tcb;*ppxIdleTaskStackBuffer = Idle_Task_Stack;*pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
}
StackType_t Timer_Task_Stack[configTIMER_TASK_STACK_DEPTH];
StaticTask_t Timer_Task_Tcb;
/*静态方法创建任务,开启软件定时器*/
/*分配软件定时器的资源*/
void vApplicationGetTimerTaskMemory( StaticTask_t ** ppxTimerTaskTCBBuffer,StackType_t ** ppxTimerTaskStackBuffer,uint32_t * pulTimerTaskStackSize )
{*ppxTimerTaskTCBBuffer = &Timer_Task_Tcb;*ppxTimerTaskStackBuffer = Timer_Task_Stack;*pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH;
}