1. 事件组的本质:一种面向位的多任务同步机制
在嵌入式实时系统中,任务间同步是构建可靠、可预测行为的核心基础。FreeRTOS 提供了队列(Queue)、二值信号量(Binary Semaphore)、计数信号量(Counting Semaphore)和互斥量(Mutex)等多种同步原语,但它们共享一个根本性限制:单点唤醒。这种设计在多数场景下足够高效,却在需要“一对多”通知的场合显露出结构性瓶颈。
以队列为典型:当一个生产者任务向满队列写入数据时,仅能唤醒一个因等待空间而阻塞的消费者任务;同理,当一个消费者从空队列读取数据时,也仅能唤醒一个因等待数据而阻塞的生产者任务。信号量与互斥量亦然——无论释放多少次信号量,每次xSemaphoreGive()最多仅唤醒一个等待该信号量的任务。这种“一对一”的耦合关系,本质上源于其内部实现依赖于单一的等待任务链表(xTasksWaitingToReceive或xTasksWaitingToSend),且调度器在唤醒时仅从链表头部取出一个任务。
当系统需求演变为“一个事件发生,需同时通知多个独立关注此事件的任务”时,上述机制便力不从心。例如,在一个工业控制节点中,主控任务检测到温度越限(Event A)、压力异常(Event B)和通信中断(Event C)三个独立状态。此时,监控告警任务需在任意一事件发生时立即响应;日志记录任务需在 A 和 C 同时发生时触发高优先级日志;而故障自恢复任务则需等待 A、B、C 全部就绪后才启动。若强行使用多个信号量或队列,不仅代码逻辑爆炸式增长,更会因唤醒顺序不可控、资源竞争加剧而导致时