news 2026/5/29 3:58:36

又是给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/5/29 3:58:14

AI如何提高财报处理效率

每到财报季,证券分析师和财务人员都面临着同样的困境:数千家上市公司密集披露财务数据,传统人工处理一份完整财报往往需要数小时甚至数天。而在这场效率革命中,采用OCRAI双引擎技术的企业,其月度报表处理周期平均缩短了…

作者头像 李华
网站建设 2026/5/26 15:59:51

【好写作AI】跨专业求职:用AI快速补齐你不熟悉的领域知识与术语

当你对目标岗位的描述仿佛在阅读另一门专业的外文文献时,别怕——你只是需要一位随身的“术语翻译官”和“知识架构师”。跨专业求职最现实的困境莫过于此:简历无处下笔,面试张口即错。面对一个陌生领域的岗位描述(JD)…

作者头像 李华
网站建设 2026/5/28 8:04:38

【好写作AI】我的合租室友是AI:它如何帮我搞定所有书面作业

深夜的宿舍,三个人对着电脑屏幕表情凝重——两个在开黑,一个在赶作业。而我的第四位“室友”,正在帮我从崩溃的边缘,打捞起最后的学术尊严。我的“第四位室友”从不睡觉,不要电费,还精通从《诗经》到Python…

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

若依框架国际化模块重构:引入Hunyuan-MT-7B动态翻译引擎

若依框架国际化模块重构:引入Hunyuan-MT-7B动态翻译引擎 在当今数字化政务、智慧教育和跨境服务平台不断拓展的背景下,多语言支持早已不再是“锦上添花”的功能,而是决定系统能否真正落地少数民族地区或国际化场景的核心能力。以若依&#xf…

作者头像 李华
网站建设 2026/5/20 18:16:29

工业现场实战:485与MODBUS协议选型指南

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个工业协议选型决策系统。输入参数包括:传输距离、节点数量、环境干扰等级、数据量大小等。系统应能:1) 自动推荐485或MODBUS协议 2) 给出典型接线图…

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

原生PHP不能操作kafka?

原生 PHP 完全可以操作 Kafka,无需 Swoole、Laravel 或其他框架。 核心依赖是 rdkafka 扩展(基于 librdkafka C 库),这是 PHP 官方支持的 Kafka 客户端,适用于 CLI 脚本、FPM、Worker 等所有原生 PHP 环境。一、扩展安…

作者头像 李华