news 2026/9/19 16:54:01

又是给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/8/29 3:03:34

清华镜像源推荐:比官方更快获取Hunyuan-MT-7B模型文件

清华镜像源加速下的 Hunyuan-MT-7B 高效部署实践 在当前多语言内容爆发式增长的背景下,高质量机器翻译已成为全球化服务、跨文化传播和政企数字化转型的关键支撑。然而,尽管各大厂商纷纷开源大模型,开发者在实际落地时仍常面临“看得见、拉不…

作者头像 李华
网站建设 2026/9/18 9:18:46

24小时开发:用快马平台打造TF卡量产工具原型

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 快速开发一个TF卡量产工具的最小可行产品(MVP)。要求:1. 基本量产功能(格式化、烧录) 2. 简单的GUI界面 3. 支持1-2种常见TF卡型号 4. 基础错误检测 5. 性能监控。使用…

作者头像 李华
网站建设 2026/9/7 10:21:19

【好写作AI】AI生成的文章,能算是我自己的作品吗?

这个问题,就像在问:用计算器算出的结果,能算是我解出的数学题吗? 在拥抱AI辅助写作的兴奋之余,一个根本性的伦理困惑随之浮现:经由我“指导”但由AI“执笔”产出的文章,著作权究竟归属于谁&…

作者头像 李华
网站建设 2026/9/17 17:17:43

用DBEVER快速构建数据库应用原型

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个快速原型工具,允许用户通过DBEVER设计数据库模型(表结构和关系),然后自动生成RESTful API和基本的前端界面(CRU…

作者头像 李华
网站建设 2026/9/18 18:50:50

Qwen3Guard-Gen-8B与主流大模型对比:安全性能优势显著

Qwen3Guard-Gen-8B与主流大模型对比:安全性能优势显著 在生成式AI如潮水般涌入各行各业的今天,一个隐忧也随之浮现:我们如何确保这些“无所不能”的模型不会说出不该说的话?从社交平台上的歧视性言论,到客服机器人无意…

作者头像 李华
网站建设 2026/9/7 10:21:19

JDK21新手教程:零基础学会5个最实用的新特性

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个面向Java初学者的JDK21教学项目,包含:1. 交互式虚拟线程demo;2. 字符串模板的简单应用;3. 基本的模式匹配示例;…

作者头像 李华