使用静态方法创建任务
一、打开configSUPPORT_STATIC_ALLOCATION
#define configSUPPORT_STATIC_ALLOCATION 1
之后需要配置定时器和空闲任务所需内存
// 空闲任务所需堆栈
static StackType_t IdleTaskStack[configMINIMAL_STACK_SIZE];
static StaticTask_t IdleTaskTCB;
//定时器任务所需堆栈
static StackType_t TimerTaskStack[configTIMER_TASK_STACK_DEPTH];
static StaticTask_t TimerTaskTCB;
// 空闲任务所需内存
void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer,
StackType_t ** ppxIdleTaskStackBuffer,
uint32_t * pulIdleTaskStackSize )/*lint !e526 Symbol not defined as it is an application callback. */
{
*ppxIdleTaskTCBBuffer = &IdleTaskTCB;
*ppxIdleTaskStackBuffer = IdleTaskStack;
* pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
}
//定时器任务所需内存
void vApplicationGetTimerTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer,
StackType_t ** ppxIdleTaskStackBuffer,
uint32_t * pulIdleTaskStackSize )/*lint !e526 Symbol not defined as it is an application callback. */
{
*ppxIdleTaskTCBBuffer = &TimerTaskTCB;
*ppxIdleTaskStackBuffer =TimerTaskStack;
* pulIdleTaskStackSize = configTIMER_TASK_STACK_DEPTH;
}
二、创建任务
TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode,
const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
const uint32_t ulStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
StackType_t * const puxStackBuffer,
StaticTask_t * const pxTaskBuffer );
1.我们需要保存静态创建的任务的任务句柄
TaskHandle_t StartTaskHandle;
StartTaskHandle = xTaskCreateStatic(。。。);
// 保存该任务的任务句柄,并赋值给StartTaskHandle
2.然后定义几个参数
#define StartTaskSize 128 //堆栈大小
#define StartTask_PRIO 1 //优先级
StackType_t StartTask_Size[StartTaskSize]; //任务堆栈
StaticTask_t StartTaskTCB; //任务控制块
3.添加到函数
StartTaskHandle = xTaskCreateStatic( (TaskFunction_t) start_task,
(char * ) "start_task", /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
(uint32_t) StartTaskSize,
(void *) NULL,
(UBaseType_t) StartTask_PRIO,
(StackType_t *) StartTask_Size,
(StaticTask_t * ) &StartTaskTCB );
4.开启任务调度
vTaskStartScheduler();
5.编写task1()和task2()
void task1()
{
while(1)
{
vTaskDelay(500);
GPIO_ResetBits(GPIOG,GPIO_Pin_1 );
vTaskDelay(500);
GPIO_SetBits(GPIOG,GPIO_Pin_1 );
}
}
void task2()
{
while(1)
{
vTaskDelay(300);
GPIO_ResetBits(GPIOG,GPIO_Pin_8);
vTaskDelay(300);
GPIO_SetBits(GPIOG,GPIO_Pin_8);
}
}
//不要忘了声明
6.编写start_task函数,并定义参数
#define Task1_Size 128
#define Task1_PRIO 2
StackType_t Task1_stack[StartTaskSize];
StaticTask_t Task1TCB;
#define Task2_Size 128
#define Task2_PRIO 3
StackType_t Task2_stack[StartTaskSize];
StaticTask_t Task2TCB;
TaskHandle_t Task1_Handler;
TaskHandle_t Task2_Handler;
void start_task()
{
//任务1
Task1_Handler = xTaskCreateStatic( (TaskFunction_t) task1,
(char * ) "task1", /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
(uint32_t) Task1_Size,
(void *) NULL,
(UBaseType_t) Task1_PRIO,
(StackType_t *) Task1_stack,
(StaticTask_t * ) &Task1TCB );
//任务2
Task2_Handler = xTaskCreateStatic( (TaskFunction_t) task2,
(char * ) "task2", /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
(uint32_t) Task2_Size,
(void *) NULL,
(UBaseType_t) Task2_PRIO,
(StackType_t *) Task2_stack,
(StaticTask_t * ) &Task2TCB );
vTaskDelete(StartTaskHandle);
}
任务创建成功