在stm32cubemx的freertos中创总任务跑支线任务

问题说明

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

解决步骤

  1. 只在CUBE中创建一个Start_Task的任务并生成。
    在这里插入图片描述

  2. 在USER下创建Start.c及Start.h文件;
    在这里插入图片描述

  3. 在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

(完)