在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); 
}

但在cube里面使用freertos创建任务时:
在stm32cubemx的freertos中创总任务跑支线任务_第1张图片
生成就会这样,无法达到“嵌套”总任务跑支线任务效果。

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. 只在CUBE中创建一个Start_Task的任务并生成。
    在stm32cubemx的freertos中创总任务跑支线任务_第2张图片

  2. 在USER下创建Start.c及Start.h文件;
    在stm32cubemx的freertos中创总任务跑支线任务_第3张图片

  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);

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里运行即可。

你可能感兴趣的:(嵌入式,stm32,嵌入式)