1. 事件标志组:嵌入式多任务协同的核心机制
在 FreeRTOS 的任务调度体系中,事件标志组(Event Group)是一种轻量级、高效率的同步与通信原语。它既不同于信号量(Semaphore)的资源计数模型,也区别于消息队列(Queue)的数据搬运范式,而是以位操作为底层逻辑,构建起一套面向“状态发生”而非“数据传递”的任务间协调机制。这种设计直击嵌入式系统中大量存在的“条件触发”场景——按键按下、传感器就绪、网络连接建立、定时器超时、外设DMA传输完成——这些事件本身不携带复杂数据,但其发生与否直接决定后续任务是否应被唤醒并执行。事件标志组正是为高效表达和响应这类布尔型状态而生。
理解其本质,需从最基础的“事件标志位”开始。一个事件标志位即一个比特(bit),其值为 1 表示对应事件已发生,值为 0 表示尚未发生。例如,定义一个uint8_t event_flag变量,用其 Bit0 表示“用户按键是否被按下”。当按键中断服务程序(ISR)检测到有效按键时,执行event_flag |= (1 << 0);主循环或某个任务则通过if (event_flag & (1 << 0))来轮询判断。这是一种最朴素的状态共享方式,但它存在两个致命缺陷:一是轮询消耗CPU资源,二是缺乏原子性保障,在多任务环境下,若任务A正在读取event_flag的瞬间,任务B或ISR恰好修改了它,便可能导致读取到一个既非全0也非全1的中间状态(尽管对单字节变量而言风险较低,但在32位变量上此问题显著)。事件标志组正是为解决这两大问题而