在stm32cubemx的freertos中创总任务跑支线任务
目录
- 问题说明
- 解决步骤
- 验证方案
- 总结
问题说明
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 */
}
解决步骤
只在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);
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中创总任务跑支线任务相关推荐
- STM32CubeMX在freeRTOS中使用printf函数
在usart.h中添加#inlcude "stdio.h" /* Includes ------------------------------------------------ ...
- 正点原子FreeRTOS(中)
更多干货推荐可以去牛客网看看,他们现在的IT题库内容很丰富,属于国内做的很好的了,而且是课程+刷题+面经+求职+讨论区分享,一站式求职学习网站,最最最重要的里面的资源全部免费!!!点击进入------ ...
- STM32CubeMX配置freertos配置任务(一)
使用STM32CubeMX 配置Freertos 生成一个任务点亮LED stm32cubemx STM32CubeMX 是 ST 意法半导体近几年来大力推荐的STM32 芯片图形化配置工具, 允许用 ...
- 中创新航冲刺港交所:年营收68亿 小米与红杉是股东
雷递网 雷建平 3月20日报道 中创新航科技股份有限公司(简称:"中创新航")日前递交招股书,准备在香港上市. 年营收68亿 中创新航成立于2007年,总部位于江苏常州,作为一家专 ...
- 中创新航IPO,锂电江湖巾帼不让须眉?
尽管与宁德时代的专利诉讼之争还在撕扯,但这并没阻碍了中创新航的上市之路. 10月6日,中创新航在港交所挂牌上市,成为港股第一只动力电池股票,一番扬眉吐气. 该股首日,破发平收,以38.00港元开盘,盘 ...
- unity 200.8m yoy_专场分享会|大会最新Unity、中创文旅专场预告来啦!
北京国际游戏创新大会将于9月25日-27日分别在中华世纪坛发布厅.中华世纪坛剧场.京都信苑国际厅.京都信苑欧式厅.京都信苑圣马可厅.京都信苑第三会议室,6大场馆举办129场游戏行业主题分享,之前小编已 ...
- 在Qt Designer中创建主Windows
在Qt Designer中创建主Windows 在Qt Designer中创建主Windows 菜单Menus 创建菜单 创建菜单项 工具栏 创建和删除工具栏 添加和删除工具栏按钮 动作Actio ...
- Stm32CubeMx lwip+freeRTOS TCP 服务
如何添加lwip参照上一篇 stm32CubeMx lwip + freeRTOS 今天讲一下,如何添加TCP服务 LwIP 提供了三种编程接口,分别为 RAW/Callback API.NETC ...
- 【中创福利】有一种年味叫公司发年货
CHINESE NEW YEAR 金牛辞旧 福虎迎春 中创送你新年幸运签 | 点击抽签 什么是年味? 年味是全家团圆的喜乐氛围 是围坐在桌前敬的那一杯酒 是屋外烟花闪耀 是屋内饭菜幽香 是家家户户门前 ...
最新文章
- was java heap space_实战项目中Java heap space错误的解决
- sync是同步还是非同步_音视频是怎么保持同步的?(四)
- Tomcat 6连接池配置
- 基于ViSual Studio 2013 + MYSQL9_5302 + Navicat for MySQL9_5302的ATM自动存取款系统
- 如何提高NLP模型鲁棒性和泛化能力?对抗训练论文串讲
- BZOJ-1069 [SCOI2007]最大土地面积
- Android好用的工具-监测,性能,网络等
- 百战程序员JavaWeb系列教程-监听器视频教程
- 用pycharm编写程序调用ADS仿真历程
- matlab函数多个零点,MATLAB中求一个双变量函数的零点
- php开发电脑i56200u,Intel Core i5-6200U性能跑分和评测 | ZMMOO
- 【图文】origin画图软件10分钟学会所有基本操作,画出精美图形
- MongoDB设置账号密码
- 告诉你苹果手机如何录屏的同时录音
- 三星回击苹果:将推指纹识别智能手机
- 关于vue中采用scoped时,组件的中css优先级
- linux USB触屏无响应驱动出现EPIPE错误
- HDU 2047 [阿牛的EOF牛肉串] 递推
- 5.凤凰架构:构建可靠的大型分布式系统 --- 架构安全性
- 语法练习:pos_neg
热门文章
- 为什么别人在微信卖东西不会被人拉黑
- Python爬虫:(亲测,已解决!)解决在使用谷歌浏览器的开发者工具时,没有Referer防盗链缺失问题。
- UOJ #138. 【UER #3】开学前的涂鸦
- 服务器常用的操作系统
- linux 开启ssdp服务,无法网络发现,Windows Server 2012如何启用SSDP Discovery服务
- DS图—图的最短路径(不含代码框架)
- PyTorch RuntimeError: size mismatch, m1:
- vs2017无法解析外部符号__imp__fprintf和__imp____iob_func
- EPICS记录参考--Waveform记录(waveform)
- PHASEN: A Phase-and-Harmonics-Aware Speech Enhancement Network