news 2026/9/3 1:37:10

又是给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/9/2 13:55:45

零基础教程:5分钟搞定远程桌面连接错误

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 制作一个交互式新手引导工具,通过卡通动画演示解决以下基础问题:1. 凭据不工作错误;2. 连接超时;3. 找不到计算机。要求每个步骤都有…

作者头像 李华
网站建设 2026/9/2 23:08:34

【好写作AI】用AI写作业是作弊吗?校园写作的伦理新边界

当ChatGPT能写出B的论文,而你自己熬夜只能得到C,这个问题的答案,从未像今天这样模糊而紧迫。深夜的宿舍里,面对着一份“分析《红楼梦》人物形象”的读后感作业,小张在搜索框里输入了问题,又迟疑地删掉——这…

作者头像 李华
网站建设 2026/9/2 12:38:37

电商系统中处理405错误的实战经验分享

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个电商API错误处理演示项目,模拟支付网关、商品管理和用户服务等模块。重点展示以下405错误场景:1)前端误用GET请求提交支付数据 2)未授权的PUT请求尝…

作者头像 李华
网站建设 2026/9/3 1:03:12

AI如何智能修复乱码?快马平台一键解码技术解析

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个能够自动检测和修复文本乱码的在线工具。功能包括:1. 支持上传文件或粘贴文本内容 2. 自动识别原始编码格式(如UTF-8、GBK等)3. 智能转…

作者头像 李华
网站建设 2026/8/31 18:52:24

零基础入门:用YOLOv13实现第一个目标检测项目

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 设计一个适合初学者的YOLOv13教学项目,要求:1) 提供详细的安装和配置说明;2) 包含简单的示例图片数据集;3) 实现基本的图像检测功能…

作者头像 李华
网站建设 2026/9/3 0:56:42

10分钟搞定RC滤波电路原型验证

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个RC滤波电路快速原型验证工具。功能要求:1. 输入目标频率特性自动生成电路参数;2. 输出可立即使用的电路图;3. 提供虚拟示波器界面观察波…

作者头像 李华