问题说明
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);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
但在cube里面使用freertos创建任务时:
生成就会这样,无法达到“嵌套”总任务跑支线任务效果。
void Start_Task(void const * argument)
{
/* USER CODE BEGIN Start_Task */
/* Infinite loop */
for(;;)
{ osDelay(1);
}
/* USER CODE END Start_Task */
}
/* USER CODE BEGIN Header_A_Task */
/**
* @brief Function implementing the A thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_A_Task */
void A_Task(void const * argument)
{
/* USER CODE BEGIN A_Task */
/* Infinite loop */
for(;;)
{ osDelay(1);
}
/* USER CODE END A_Task */
}
/* USER CODE BEGIN Header_B_Task */
/**
* @brief Function implementing the B thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_B_Task */
void B_Task(void const * argument)
{
/* USER CODE BEGIN B_Task */
/* Infinite loop */
for(;;)
{ osDelay(1);
}
/* USER CODE END B_Task */
}
/* USER CODE BEGIN Header_C_Task */
/**
* @brief Function implementing the C thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_C_Task */
void C_Task(void const * argument)
{
/* USER CODE BEGIN C_Task */
/* Infinite loop */
for(;;)
{ osDelay(1);
}
/* USER CODE END C_Task */
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
解决步骤
-
只在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);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
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()); /* 结束自身 */
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
验证方案
调用freertos的信息状态查询和时间统计的api函数即可。
总结
只要创建一个Start.task任务就好,然后再创一个文件里面放其他任务的创建,然后在官方生成的freertos.c里运行即可。
文章来源: blog.csdn.net,作者:爱学习、努力成长中的虾皮,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/Lovedni/article/details/113852987