1. 事件标志组原理与工程价值
事件标志组(Event Group)是 FreeRTOS 提供的一种轻量级同步机制,专为多任务间基于位模式的事件通知与等待而设计。它并非简单的布尔标志或计数信号量,而是以 32 位无符号整数为底层载体,每个比特位可独立表示一个特定事件的状态(置位/清除)。这种设计使其天然适用于“多条件组合触发”场景——例如本例中要求“Key1且Key2 同时发生”,或“Key1或Key2 任一发生”即可响应。
在嵌入式实时系统中,事件标志组的核心价值在于解耦与高效。传统方式下,若需等待多个外部事件(如按键、传感器就绪、通信接收完成),开发者常被迫采用轮询+全局变量+互斥锁的组合,这不仅消耗 CPU 周期,还引入竞态风险与复杂锁管理。而事件标志组将事件状态的存储、原子性修改(置位/清除)、条件等待(逻辑与/或)全部封装于内核 API 中,任务仅需关注“我关心哪些位”和“我期望何种逻辑关系”,其余均由内核保障原子性与线程安全。其内存开销固定(一个EventGroupHandle_t句柄 + 少量内核控制块),远低于创建多个二值信号量或队列,特别适合资源受限的 MCU 平台。
需要明确的是,事件标志组与信号量(Semaphore)存在本质区别:信号量用于资源访问控制(计数型/二值型),核心语义是“可用资源数量”;而事件标志组用于事件状态通知,核心语义是“某类事件是否已发生”。二者不可混用。例如,用信号量模拟“双按键”需两个信号量加额外状态机,代码臃肿且易出错;而事件标志组仅需两位、一次等待调用,逻辑清晰、执行高效。