1. 任务通知机制的本质与信号量模拟原理
在 FreeRTOS 中,任务通知(Task Notification)并非一种独立的同步原语,而是内嵌于每个任务控制块(TCB)中的轻量级通信机制。其核心设计思想是将通知状态直接绑定到任务实体,彻底规避了传统队列、信号量等对象所需的额外内存分配与管理开销。每个任务的 TCB 结构体中均包含一个ulNotifiedValue成员变量和一个eNotifyState状态枚举,二者共同构成了通知值的存储与流转基础。
这种设计带来了三个根本性优势:第一,零动态内存分配——无需xQueueCreate()或xSemaphoreCreateBinary();第二,极低的上下文切换开销——通知发送与接收可直接操作目标任务的 TCB,避免了队列缓冲区的拷贝与锁竞争;第三,确定性的执行时间——所有通知操作均为纯 CPU 指令序列,无不可预测的阻塞点。正因如此,任务通知被官方文档明确定义为“FreeRTOS 中最快的任务间通信方式”。
当我们将任务通知用于模拟信号量时,本质是复用其通知值的原子更新能力来映射信号量的计数值行为。二值信号量(Binary Semaphore)仅需表示“有”或“无”两种状态,因此其计数值域为 {0, 1};而计数型信号量(Counting Semaphore)则需支持大于 1 的整数计数,其上限由创建时指定的初始值决定。任务通知通过eNotifyAction参数提供了四种精确的原子更新操作:
eSetBits:按位或操作,