目录
- 问题说明
-
- 解决步骤
-
- 验证方案
-
- 总结
问题说明
STM32CUBE的freertos的任务创建十分简单方便,但却有一个麻烦:需要我们把要跑的任务具体代码都写进freertos.c的文件里面,对于在对应文件创建任务的伙伴来说,使用多线程任务时仍然比较麻烦。
问题举例:原本有A,B,C三个任务,原来我们在各自A.c,B.c,C.c的文件中写好了A_task,B_task,C_task,只要在创多一个总任务文件Start.c,里面创建好Star_task的freertos任务,然后在此任务内创建A_task,B_task,C_task的freertos任务,就可以实现总任务里面跑支线任务了。如下:
//void A_task(void * pvParameters);void B_task(void *pvParameters);void C_task(void * pvParameters);已经在A.c,B.c,C.c写好
//Start.c里面的内容
#define A_TASK_PRO 19
#define A_STK_SIZE 512
TaskHandle_t A_Task_Handler;
void A_task(void * pvParameters);
#define B_TASK_PRO 18
#define B_STK_SIZE 256
TaskHandle_t B_Task_Handler;
void B_task(void * pvParameters);
#define C_TASK_PRO 17
#define C_STK_SIZE 256
TaskHandle_t C_Task_Handler;
void C_task(void * pvParameters);
#define START_TASK_PRO 1
#define START_STK_SIZE 256
TaskHandle_t Start_Task_Handler;
void start_task(void * pvParameters);
void start_task(void * pvParameters)
{
taskENTER_CRITICAL();
//create A_task
xTaskCreate((TaskFunction_t)A_task,
(char *)"A_task",
(uint16_t)A_STK_SIZE,
(void *)NULL,
(UBaseType_t)A_TASK_PRO,
(TaskHandle_t *)&A_Task_Handler);
//create B_task
xTaskCreate((TaskFunction_t)B_task,
(char *)"B_task",
(uint16_t)B_STK_SIZE,
(void *)NULL,
(UBaseType_t)B_TASK_PRO,
(TaskHandle_t *)&B_Task_Handler);
//create C_task
xTaskCreate((TaskFunction_t)C_task,
(char *)"C_task",
(uint16_t)C_STK_SIZE,
(void *)NULL,
(UBaseType_t)C_TASK_PRO,
(TaskHandle_t *)&C_Task_Handler);
vTaskDelete(Start_Task_Handler); //删除开始任务
taskEXIT_CRITICAL(); //退出临界区
}
void create_start_task(void)
{
xTaskCreate((TaskFunction_t)start_task,
(char *)"start_task",
(uint16_t)START_STK_SIZE,
(void *)NULL,
(UBaseType_t)START_TASK_PRO,
(TaskHandle_t *)&Start_Task_Handler);
}
但在cube里面使用freertos创建任务时:
生成就会这样,无法达到“嵌套”总任务跑支线任务效果。
void Start_Task(void const * argument)
{
for(;;)
{
osDelay(1);
}
}
void A_Task(void const * argument)
{
for(;;)
{
osDelay(1);
}
}
void B_Task(void const * argument)
{
for(;;)
{
osDelay(1);
}
}
void C_Task(void const * argument)
{
for(;;)
{
osDelay(1);
}
}
解决步骤
-
只在CUBE中创建一个Start_Task的任务并生成。
-
在USER下创建Start.c及Start.h文件;
-
在Start_task.c文件中的Start_task中创建A,B,C任务
osThreadId_t A_task_Handler;
const osThreadAttr_t A_task_attr = {
.name = "A_task",
.priority = (osPriority_t) osPriorityBelowNormal4,
.stack_size = 128 * 4
};
void A_task(void *argument);
osThreadId_t B_task_Handler;
const osThreadAttr_t B_task_attr = {
.name = "B_task",
.priority = (osPriority_t) osPriorityBelowNormal4,
.stack_size = 256 * 4
};
void B_task(void *argument);
osThreadId_t C_task_Handler;
const osThreadAttr_t C_task_attr = {
.name = "C_task",
.priority = (osPriority_t) osPriorityLow7,
.stack_size = 256 * 4
};
void C_task(void *argument);
4.在Core内freertos.c文件内的start_task改
void Start_Task(void const * argument)
{
//create A_task
A_task_Handler = osThreadNew(A_task, NULL, &A_task_attr);
//create B_task
B_task_Handler = osThreadNew(B_task, NULL, &B_task_attr);
//create C_task
C_task_Handler = osThreadNew(C_task, NULL, &C_task_attr);
osThreadTerminate(osThreadGetId());
}
验证方案
调用freertos的信息状态查询和时间统计的api函数即可。
总结
只要创建一个Start.task任务就好,然后再创一个文件里面放其他任务的创建,然后在官方生成的freertos.c里运行即可。