目录

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

问题说明

STM32CUBE的freertos的任务创建十分简单方便,但却有几个麻烦:
1.需要我们把要跑的任务具体代码都写进freertos.c的文件里面,对于在对应文件创建任务的伙伴来说,使用多线程任务时仍然比较麻烦。
2.就是因为CUBE生成的任务都在freertos.c文件里,没有"嵌套"功能,如果要在其中一个任务里调用任务api函数,进入另一个任务并运行,此时CUBE里会永远在跑进入的那个任务,从而无法正常运行其他任务,具体看我评论举例。
问题举例:原本有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_taskxTaskCreate((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)
{/* 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的任务并生成。

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

在stm32cubemx的freertos中创总任务跑支线任务相关推荐

  1. STM32CubeMX在freeRTOS中使用printf函数

    在usart.h中添加#inlcude "stdio.h" /* Includes ------------------------------------------------ ...

  2. 正点原子FreeRTOS(中)

    更多干货推荐可以去牛客网看看,他们现在的IT题库内容很丰富,属于国内做的很好的了,而且是课程+刷题+面经+求职+讨论区分享,一站式求职学习网站,最最最重要的里面的资源全部免费!!!点击进入------ ...

  3. STM32CubeMX配置freertos配置任务(一)

    使用STM32CubeMX 配置Freertos 生成一个任务点亮LED stm32cubemx STM32CubeMX 是 ST 意法半导体近几年来大力推荐的STM32 芯片图形化配置工具, 允许用 ...

  4. 中创新航冲刺港交所:年营收68亿 小米与红杉是股东

    雷递网 雷建平 3月20日报道 中创新航科技股份有限公司(简称:"中创新航")日前递交招股书,准备在香港上市. 年营收68亿 中创新航成立于2007年,总部位于江苏常州,作为一家专 ...

  5. 中创新航IPO,锂电江湖巾帼不让须眉?

    尽管与宁德时代的专利诉讼之争还在撕扯,但这并没阻碍了中创新航的上市之路. 10月6日,中创新航在港交所挂牌上市,成为港股第一只动力电池股票,一番扬眉吐气. 该股首日,破发平收,以38.00港元开盘,盘 ...

  6. unity 200.8m yoy_专场分享会|大会最新Unity、中创文旅专场预告来啦!

    北京国际游戏创新大会将于9月25日-27日分别在中华世纪坛发布厅.中华世纪坛剧场.京都信苑国际厅.京都信苑欧式厅.京都信苑圣马可厅.京都信苑第三会议室,6大场馆举办129场游戏行业主题分享,之前小编已 ...

  7. 在Qt Designer中创建主Windows

    在Qt Designer中创建主Windows 在Qt Designer中创建主Windows 菜单Menus 创建菜单 创建菜单项 工具栏 创建和删除工具栏 添加和删​​除工具栏按钮 动作Actio ...

  8. Stm32CubeMx lwip+freeRTOS TCP 服务

    如何添加lwip参照上一篇   stm32CubeMx lwip + freeRTOS 今天讲一下,如何添加TCP服务 LwIP 提供了三种编程接口,分别为 RAW/Callback API.NETC ...

  9. 【中创福利】有一种年味叫公司发年货

    CHINESE NEW YEAR 金牛辞旧 福虎迎春 中创送你新年幸运签 | 点击抽签 什么是年味? 年味是全家团圆的喜乐氛围 是围坐在桌前敬的那一杯酒 是屋外烟花闪耀 是屋内饭菜幽香 是家家户户门前 ...

最新文章

  1. was java heap space_实战项目中Java heap space错误的解决
  2. sync是同步还是非同步_音视频是怎么保持同步的?(四)
  3. Tomcat 6连接池配置
  4. 基于ViSual Studio 2013 + MYSQL9_5302 + Navicat for MySQL9_5302的ATM自动存取款系统
  5. 如何提高NLP模型鲁棒性和泛化能力?对抗训练论文串讲
  6. BZOJ-1069 [SCOI2007]最大土地面积
  7. Android好用的工具-监测,性能,网络等
  8. 百战程序员JavaWeb系列教程-监听器视频教程
  9. 用pycharm编写程序调用ADS仿真历程
  10. matlab函数多个零点,MATLAB中求一个双变量函数的零点
  11. php开发电脑i56200u,Intel Core i5-6200U性能跑分和评测 | ZMMOO
  12. 【图文】origin画图软件10分钟学会所有基本操作,画出精美图形
  13. MongoDB设置账号密码
  14. 告诉你苹果手机如何录屏的同时录音
  15. 三星回击苹果:将推指纹识别智能手机
  16. 关于vue中采用scoped时,组件的中css优先级
  17. linux USB触屏无响应驱动出现EPIPE错误
  18. HDU 2047 [阿牛的EOF牛肉串] 递推
  19. 5.凤凰架构:构建可靠的大型分布式系统 --- 架构安全性
  20. 语法练习:pos_neg

热门文章

  1. 为什么别人在微信卖东西不会被人拉黑
  2. Python爬虫:(亲测,已解决!)解决在使用谷歌浏览器的开发者工具时,没有Referer防盗链缺失问题。
  3. UOJ #138. 【UER #3】开学前的涂鸦
  4. 服务器常用的操作系统
  5. linux 开启ssdp服务,无法网络发现,Windows Server 2012如何启用SSDP Discovery服务
  6. DS图—图的最短路径(不含代码框架)
  7. PyTorch RuntimeError: size mismatch, m1:
  8. vs2017无法解析外部符号__imp__fprintf和__imp____iob_func
  9. EPICS记录参考--Waveform记录(waveform)
  10. PHASEN: A Phase-and-Harmonics-Aware Speech Enhancement Network