1. 二值信号量原理与工程定位
二值信号量(Binary Semaphore)是 FreeRTOS 中最基础、最常用的同步原语之一。它本质上是一个只能取两个值(0 或 1)的计数器,其行为严格遵循“互斥访问”和“任务同步”两大核心语义。在嵌入式实时系统中,它不用于资源计数(那是计数型信号量的职责),而是作为任务间通信的“开关”或“令牌”,用于解决临界区保护、事件通知、任务唤醒等典型问题。
理解其底层机制是正确使用的前提。FreeRTOS 的二值信号量并非一个独立的数据结构,而是基于队列(Queue)机制实现的特化封装。具体而言,它被实现为一个长度为 1、项大小为 0 字节的队列。这个设计非常精妙:队列的“满”状态对应信号量值为 1(有令牌可用),队列的“空”状态对应信号量值为 0(无令牌可用)。所有xSemaphoreGive()和xSemaphoreTake()操作,最终都映射为对这个微型队列的xQueueSend()和xQueueReceive()调用。这种实现方式保证了信号量操作的原子性——在中断或任务上下文中调用这些 API 时,FreeRTOS 内核会自动禁用/恢复调度器或中断,确保操作不会被抢占,从而杜绝了竞态条件。
在 STM32 平台的工程实践中,二值信号量的典型应用场景包括:
-按键事件通知:当外部中断(如 EXTI)检测到按键按下时,在中断服务函数(ISR)中Give一个信号量;而一个低优先级的任务在主循环中Take该信号量,从而将