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

   日期:2021-02-20     浏览:94    评论:0    
核心提示:目录问题说明解决步骤验证方案总结问题说明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_ta

目录

  • 问题说明
    • 解决步骤
      • 验证方案
        • 总结

问题说明

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

解决步骤

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

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

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服