当前位置: 首页 > news >正文

FreeRtos——4、控制流模型:信号量与事件组

前言

在打通了任务间的“数据流”之后,我们面临的是更复杂的“逻辑同步”问题。在 RTOS 中,任务不是各玩各的player,而是需要听从统一指挥的一支team。

很多开发者习惯用一个全局标志位uint8_t is_wifi_ready,然后在另一个任务里死循环while(!is_wifi_ready)。这在 RTOS 中是重大的资源浪费。我们需要的是能够让任务原地休眠、精准唤醒的机制。

1:痛点:同步逻辑写得像乱麻

  • 死等(Polling):浪费 CPU 周期,延迟高。

  • 优先级反转:低优先级任务拿着资源不撒手,高优先级任务只能干着急。

  • 多条件困境:任务需要同时满足“串口有数据”且“按键已按下”才能运行,用信号量怎么写?

2:知识点:控制流的三大利器

2.1二值信号量 (Binary Semaphore)

信号量本质是一个“令牌”。

  • 场景:中断告诉任务“数据来了”。

  • 关键:它不具备“所有权”概念。A 释放(Release), B 可以获取(Acquire)。

2.2互斥锁 (Mutex) —— 重点讲优先级反转

互斥锁不仅是令牌,还是“带锁的钥匙”。

  • 关键:谁上锁谁解锁。它具备优先级继承机制。如果高优先级任务在等一个被低优先级任务持有的互斥锁,内核会临时提升低优先级任务的级别,让它赶紧干完活撒手。这是信号量做不到的。

2.3任务通知 (Task Notifications) —— FreeRTOS 的“秘密武器”

在 CMSIS-V2 中对应osThreadFlags。它是直接发给某个任务的信号,不需要创建额外的内核对象(如信号量),因此速度极快,省 RAM。

3:实现一个多条件触发的“逻辑门”

场景:我们要开发一个物联网设备。逻辑是:必须 WiFi 连接成功(事件 A)且 NTP 对时成功(事件 B),才允许启动 MQTT 发送任务。

3.1 定义事件组 (Event Flags)

osEventFlagsId_t system_event_id; // 定义事件位 #define FLAG_WIFI_READY (1 << 0) #define FLAG_NTP_OK (1 << 1) void Init_Control_Flow(void) { system_event_id = osEventFlagsNew(NULL); }

3.2 生产者任务:设置事件位

/* 模拟 WiFi 处理任务 */ void StartWiFiTask(void *argument) { for(;;) { // 模拟连接过程 osDelay(2000); // 连接成功,发送标志 osEventFlagsSet(system_event_id, FLAG_WIFI_READY); osThreadTerminate(osThreadGetId()); // 连完就自毁或进入休眠 } }

3.3 消费者任务:逻辑门等待 (AND 逻辑)

/* MQTT 业务任务 */ void StartMQTTTask(void *argument) { for(;;) { // 核心实操:等待多个标志位同时置 1 (osFlagsWaitAll) // 最后一个参数 osWaitForever:不满足条件时,任务彻底不占 CPU uint32_t flags = osEventFlagsWait(system_event_id, FLAG_WIFI_READY | FLAG_NTP_OK, osFlagsWaitAll, osWaitForever); if (!(flags & 0x80000000)) { // 检查是否返回错误码 // 只有 WiFi 和 NTP 都 OK,才会跑到这里 printf("Logic Gate Open: Starting MQTT Publishing...\r\n"); } } }

4:使用“任务通知”替代信号量

如果你只需要简单的“一对一”同步,用osThreadFlags更专业。

/* 任务 A (接收端) */ void StartDataTask(void *argument) { for(;;) { // 阻塞等待自己的 ThreadFlag osThreadFlagsWait(0x01, osFlagsWaitAny, osWaitForever); printf("Task Notified!\r\n"); } } /* 任务 B (触发端) */ void TriggerTask(void *argument) { osThreadFlagsSet(DataTaskHandle, 0x01); // 直接拍对方的肩膀 }

5. 总结本章

信号量是任务间的红绿灯,乱设红绿灯只会造成交通瘫痪;学会用事件组做逻辑门,用任务通知做点对点加速。

http://www.jsqmd.com/news/407186/

相关文章:

  • 2026水泵选购参考:国内靠谱厂家实力排行,8040反渗透膜/美国GE反渗透膜/进口反渗透膜,水泵公司哪家权威 - 品牌推荐师
  • AI模型压测工具:TensorFlow Serving的QPS瓶颈定位实战
  • 基于python的农村低保户贫困户管理系统 网站设计与实现
  • 2026年热门的高效节能冷库变频机组/集装箱式冷库变频机组生产厂家采购指南帮我推荐几家 - 行业平台推荐
  • 2026 靠谱冷水机厂家推荐:品牌、实力、售后一次说清 - 博客万
  • FreeRtos——5、资源模型:临界区与共享资源
  • 3.4 模型排名与Elo:Pairwise对比评估实战指南
  • 过知网AIGC检测用什么降AI软件?实测推荐这几款
  • 探讨2026年铁皮打球机,高口碑厂家怎么收费 - 工业品网
  • 2026年市面上比较好的方形横流冷却塔制造企业怎么选择,冷却塔填料/冷却水塔,方形横流冷却塔直销厂家怎么选择 - 品牌推荐师
  • 维普万方查AI太严?这两款降AI工具一次搞定
  • 2026年深圳口碑排名前十天御香山花园、万科臻山府、福田熙园房产销售推荐 - myqiye
  • 2026 年 WAF 技术演进:从规则匹配到 AI 行为分析的对抗实战
  • 2026年质量好的陕西MVR浓缩器/MVR浓缩器哪家便宜源头直供参考(真实参考) - 行业平台推荐
  • 春节出境游✅ 机场通关别再死等啦!
  • 陕西医科学校招生电话能了解什么内容?为你解惑 - 工业品牌热点
  • 基于DevEco鸿蒙开垃圾分类APP实现
  • 从此告别拖延!千笔ai写作,碾压级的AI论文工具
  • 2026年2月烟台旅行社推荐竞争格局深度分析报告 - 2026年企业推荐榜
  • 基于SSM的共享电动车管理系统[SSM]-计算机毕业设计源码+LW文档
  • 2026年比较好的石家庄商城小程序开发/石家庄APP小程序开发服务好评推荐机构 - 行业平台推荐
  • 【2026最新】HD Tune Pro下载安装全攻略:硬盘健康状态一键检测(附安装包) - sdfsafafa
  • 职场人写报告被查AI?这两款降AI工具解救你
  • Python 开发|企微外部群主动发消息实操指南
  • 2026年比较好的儿童房设计/女孩儿童房信誉优质供应参考(可靠) - 行业平台推荐
  • 2026年比较好的泡沫消防车/湖北干粉消防车厂家采购参考指南 - 行业平台推荐
  • 分期乐购物额度回收靠谱吗?详解安全流程与使用建议 - 团团收购物卡回收
  • 2026陕西舞蹈艺考怎么选?五大专业舞蹈培训机构助力统考与校考 - 深度智识库
  • 2026年分析比较不错的LED显示屏专业公司,选购攻略分享 - 工业推荐榜
  • 2026年靠谱的锰13钢板/太钢锰钢板高评分品牌推荐(畅销) - 行业平台推荐