news 2026/6/10 18:36:07

又是给freeRTOS 造轮子的一天

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
又是给freeRTOS 造轮子的一天

关注、星标公众号,直达精彩内容

素材来源:技术让梦想更伟大

作者:李肖遥

FreeRTOS 是一个可裁剪、可剥夺型的多任务内核,而且没有任务数限制,在此之前分析过很多了。这个东西还是很强大的也很实用,参考精选汇总 | freertos从基础到高级篇系列

FreeRTOS 提供了实时操作系统所需的所有功能,包括资源管理、同步、任务通信等,本篇主要说一下任务通信,我们选用接口是CMSIS_V2,之前也讲到过stm32CubeIDE中CMSIS_V1和CMSIS_V2选项的区别。

来看看怎么操作,首先创建两个任务

然后再创建2个事件拉下来也可以配置以下信息,在此我们默认配置就可以了

  • Semaphore Name:信号量名称

  • Count:计数信号量的最大值

  • Allocation:分配方式:Dynamic 动态内存创建

  • Conrol Block Name:控制块名称

生成代码之后任务和事件代码如下

/* Definitions for myTask01 */ osThreadId_t myTask01Handle; const osThreadAttr_t myTask01_attributes = { .name = "myTask01", .stack_size = 128 * 4, .priority = (osPriority_t) osPriorityLow, }; /* Definitions for myTask02 */ osThreadId_t myTask02Handle; const osThreadAttr_t myTask02_attributes = { .name = "myTask02", .stack_size = 128 * 4, .priority = (osPriority_t) osPriorityLow, }; /* Definitions for myEvent01 */ osEventFlagsId_t myEvent01Handle; const osEventFlagsAttr_t myEvent01_attributes = { .name = "myEvent01" }; /* Definitions for myEvent02 */ osEventFlagsId_t myEvent02Handle; const osEventFlagsAttr_t myEvent02_attributes = { .name = "myEvent02" };

这个是创建任务的句柄

/* creation of myTask01 */ myTask01Handle = osThreadNew(StartTask01, NULL, &myTask01_attributes); /* creation of myTask02 */ myTask02Handle = osThreadNew(StartTask02, NULL, &myTask02_attributes);

我们改写代码,实现task2往task发送信号,实现简单的任务通信。

/* USER CODE END Header_StartTask01 */ void StartTask01(void *argument) { /* USER CODE BEGIN StartTask01 */ /* Infinite loop */ osStatus_t os_Status; while(1) { os_Status = osEventFlagsWait(myTask02Handle, /* 事件标志组ID */ COMM2_EVENT, /* 等待事件标志位0与事件标志位1 */ osFlagsWaitAny, /* 逻辑或 */ osWaitForever /* 一直等待 */ ); if(os_Status == COMM1_EVENT) { printf("startTask02 is running.\r\n"); } } /* USER CODE END StartTask01 */ } /* USER CODE BEGIN Header_StartTask02 */

osEventFlagsWait函数的具体实现以及定义如下

osEventFlagsSet就是往某个任务的句柄发送一个信号,实现如下

/* USER CODE END Header_StartTask02 */ void StartTask02(void *argument) { /* USER CODE BEGIN StartTask02 */ /* Infinite loop */ for(;;) { osEventFlagsSet(myEvent01Handle, COMM1_EVENT); osDelay(1); } /* USER CODE END StartTask02 */ }
至此基本结构就完成了,后续就根据实际需要来实现任务要做的事情,可以创建多个,使用任务间通信来进行传递。 ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧ END ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧ 关注我的微信公众号,回复“加群”按规则加入技术交流群。
点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 15:49:48

C#调用Python子进程执行Hunyuan-MT-7B翻译任务

C#调用Python子进程执行Hunyuan-MT-7B翻译任务 在当今企业级应用日益智能化的背景下,如何让传统的 .NET 生态系统无缝接入前沿 AI 模型能力,成为许多开发者面临的真实挑战。尤其是在多语言内容处理需求激增的场景下——从跨国企业的文档本地化&#xff0…

作者头像 李华
网站建设 2026/6/10 16:03:12

告别Maven编译噩梦:3招提升构建效率90%

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个效率对比演示项目,展示:1. 传统方式解决FAILED TO EXECUTE GOAL org.apache.maven.plugins:maven-compiler-plugin:3.14.0错误的全过程&#xff08…

作者头像 李华
网站建设 2026/6/10 14:35:16

【好写作AI】当AI开始写作:我们的大学生会被“养废”吗?

这或许是我们时代最矛盾的忧虑:我们创造工具来解放自己,却又恐惧被工具驯服。每当有新技术普及,类似的担忧总会浮现。当计算器出现时,人们担心学生不会再心算;当搜索引擎普及时,人们忧虑记忆力和检索能力会…

作者头像 李华
网站建设 2026/6/10 14:18:05

CHOWN vs 手动修改:批量处理文件权限的效率对比

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个Shell脚本,使用CHOWN命令批量修改指定目录下所有文件和子目录的权限。要求:1) 递归处理子目录;2) 支持通配符过滤;3) 显示处…

作者头像 李华
网站建设 2026/6/5 7:21:16

熵权法实战:城市空气质量评估系统开发全流程

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个城市空气质量评估系统,功能包括:1.爬取环保局公开监测数据 2.数据清洗和标准化 3.熵权法计算各污染指标权重 4.生成城市空气质量指数排名 5.可视化…

作者头像 李华
网站建设 2026/6/9 17:19:37

柔性与刚柔结合PCB在汽车电子领域有哪些适配要求?

问: 现在汽车电子对柔性和刚柔结合 PCB 的需求越来越大,相比消费电子,汽车领域对它们的特殊制造工艺有哪些额外的适配要求? 答: 汽车电子是柔性与刚柔结合 PCB 的高端应用场景,和消费电子相比,…

作者头像 李华