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

FreeRTOS事件组(Event Group)

1. 概念定位

对比维度事件组信号量 (Semaphore)消息队列 / 流
核心目的多位、广播式同步互斥 / 计数传递数据并同步
粒度最多 24 位用户位1 次 1 令牌任意字节 / 项
等待条件任意位 AND / OR获取令牌取到数据
唤醒范围满足条件的所有任务每次唤醒 1 任务每条数据唤醒 1 任务

适用场景:

  • 多个任务需要对 同一事件 作出反应;
  • 单个任务需等待 多种条件 同时满足;
  • 不想用轮询,且要兼顾低功耗睡眠。

2. 数据结构

32-bit 标志字
┌───────┬───────────┬────────────┐
│ 系统位 │ 控制位    │  用户位0-23 │
└───────┴───────────┴────────────┘
  • 0-23 位:用户自定义事件;
  • 高 8 位:FreeRTOS 内部使用(禁写)。

xEventGroupCreate() 动态创建(≈40 B);也可用 xEventGroupCreateStatic() 静态创建。


3. 关键 API

类别原型说明
创建/删除xEventGroupCreate()
vEventGroupDelete()
删除前必须确保没有任务仍在等待
设置/清除位xEventGroupSetBits()
xEventGroupClearBits()
中断中用 …FromISR 版本
等待xEventGroupWaitBits(h,bits,clear,onAll,timeout)clear=pdTRUE 时自动清零触发位; onAll=pdTRUE 为 AND,否则 OR
同步屏障xEventGroupSync()多任务“栅栏”
查询xEventGroupGetBits()非阻塞读取当前标志字

ISR 中 只能SetBitsFromISR / ClearBitsFromISR,不能 Wait


4. 常见模式

4.1 AND 等待(所有子系统就绪)

enum { WIFI_OK = BIT0, AFE_OK = BIT1, CLOUD_OK = BIT2 };xEventGroupWaitBits(evt,WIFI_OK | AFE_OK | CLOUD_OK,pdFALSE,  // 保留位pdTRUE,   // 等全部portMAX_DELAY);

4.2 OR 等待(任一事件即唤醒)

EventBits_t bits = xEventGroupWaitBits(evt,BIT0 | BIT1 | BIT2,pdTRUE,   // 自动清零触发位pdFALSE,  // 任意即可pdMS_TO_TICKS(1000));

4.3 广播唤醒

同一位被 SetBits,所有等待该位的任务都会被唤醒。


5. 性能与功耗

  • O(1) 设置/清除;
  • 任务真正阻塞于内核队列,可进入浅睡;
  • 每组对象仅 ~40 B 堆内存。

6. 设计注意

  • 仅使用 0-23 位;常量要 & 0x00FFFFFFu
  • clearOnExit 在任务被唤醒后执行清零;
  • 多任务手动清同一位需自管同步;
  • 中断里别频繁 “Set→Clear”,可合并事件。

7. POSIX 对照

POSIX 同类对象FreeRTOS 对应
pthread_cond + mutexEventGroup
pthread_barrierxEventGroupSync

小结示例

event_group_ = xEventGroupCreate();// Wi-Fi 任务
xEventGroupSetBits(event_group_, WIFI_OK);// 统筹任务
xEventGroupWaitBits(event_group_,WIFI_OK | AFE_OK,pdFALSE,pdTRUE,pdMS_TO_TICKS(5000));

这样就能用一次 O(1) 操作完成多事件同步,比轮询或多个信号量更简洁高效。

http://www.lqws.cn/news/471079.html

相关文章:

  • Rust调用 DeepSeek API
  • kibana和elasticsearch安装
  • Docker简单介绍与使用以及下载对应镜像(项目前置)
  • 《揭开CSS渲染的隐秘角落:重排与重绘的深度博弈》
  • 《Whisper:开启语音识别新时代的钥匙》
  • 【Redis】深入理解 Redis 事务:命令、应用与实战案例
  • SiteAzure:解决数据库服务器内存频繁吃满
  • 【Weaviate底层机制】分布式一致性深度解析:Raft算法与最终一致性的协同设计
  • PHP语法基础篇(五):流程控制
  • 给交叉工具链增加libelf.so
  • PowerShell读取CSV并遍历组数组
  • 在 `setup` 函数中实现路由跳转:Vue3与Vue Router 4的集成
  • 《Whisper模型版本及下载链接》
  • 网络钓鱼攻击
  • 【论文笔记】【强化微调】T-GRPO:对视频数据进行强化微调
  • [muduo] TcpConnection | 回调交互
  • LLM-201: OpenHands与LLM交互链路分析
  • Linux致命漏洞CVE-2025-6018和CVE-2025-6019
  • 1、自然语言处理任务全流程
  • 什么是redission看门狗机制
  • Redis 分布式锁、红锁分别是什么?红锁有什么问题?
  • Python漂浮的爱心
  • 【Ambari3.0.0 部署】Step2—免密登陆认证-适用于el8
  • 智能机器人后期会如何发展?
  • 【烧脑算法】枚举:有序穷举,分步排查
  • 植物神经小知识
  • 教育培训APP源码核心功能开发详解:直播、考试、组卷系统全拆解
  • 力扣1546. 和为目标值且不重叠的非空子数组的最大数目
  • 1. 常见K线组合
  • 【STM32笔记】F1F4 STM32初识、MDK调试、HAL简介