声明及感谢: 跟随正点原子资料学习, 在此作为学习的记录和总结
环境 keil , stm32f103
1. 任务的创建 :
创建任务的方法有三种:
(1) 动态创建:
xTaskCreate();
使用此xTaskCreate函数 需配置 configSUPPORT_DYNAMIC_ALLOCATION 宏定义为1
// 创建开始任务
xTaskCreate((TaskFunction_t )start_task, // 任务函数
(const char* )"start_task", // 任务名称
(uint16_t )START_STK_SIZE, // 任务堆栈大小
(void* )NULL, // 传递给任务函数的参数
(UBaseType_t )START_TASK_PRIO, // 任务优先级
(TaskHandle_t* )&StartTask_Handler); // 任务句柄
vTaskStartScheduler(); // 开启任务调度
(2)静态创建
xTaskCreateStatic();
与动态创建方法相同 也需要配置一个宏定义.
configSUPPORT_STATIC_ALLOCATION 为1
当配置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;
// 获取空闲任务无地任务堆栈和任务控制块内存, 函数
// 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;
}
// 创建任务
StartTask_Handler=xTaskCreateStatic((TaskFunction_t )start_task, // 任务函数
(const char* )"start_task", // 任务名称
(uint32_t )START_STK_SIZE, // 任务堆栈大小
(void* )NULL, // 传递给任务函数的参数
(UBaseType_t )START_TASK_PRIO, // 任务优先级
(StackType_t* )StartTaskStack, // 任务堆栈
(StaticTask_t* )&StartTaskTCB); // 任务控制块
vTaskStartScheduler(); // 开启任务调度
(3) 使用xTaskCreateRestricted()函数创建任务
xTaskCreateRestricted 此函数也是用来创建任务的,只不过此函数要求所使用的MCU有MPU(内存保护单元),用此函数创建的任务会受到MPU的保护, 其他的功能和xTaskCreate()一样
2. 任务的创建 :
vTaskDelete(StartTask_Handler); // 删除任务