1. 临界段代码的本质与工程意义
在嵌入式实时系统中,“临界段代码”(Critical Section)并非一个抽象概念,而是由硬件中断响应机制和软件任务调度逻辑共同定义的、具有严格时序约束的执行区域。其核心特征在于:该段代码必须以原子方式完成,期间不允许任何中断或任务切换打断其执行流。这种原子性不是由编译器保证,而是由开发者主动介入中断控制机制来强制实现。
理解临界段的关键,在于厘清它所要防范的两类并发风险:
- 硬件中断干扰:当外设寄存器配置存在严格时序依赖(例如某些ADC校准序列、SPI Flash写保护解除、I2C总线复位恢复),若在配置中途被更高优先级中断抢占,可能导致外设进入不可预测状态,甚至锁死总线。
- RTOS任务抢占:在多任务环境下,若共享资源(如全局链表、环形缓冲区指针、硬件寄存器映射结构体)的读-改-写操作被其他任务打断,将直接引发数据不一致。例如,一个任务正在修改
uart_tx_buffer_head,此时被另一个任务抢占并同样修改该变量,最终导致缓冲区索引错乱,数据丢失。
FreeRTOS 的临界段保护机制,正是为应对上述两类风险而设计的一套轻量、可嵌套、且与底层架构深度耦合的同步原语。它不依赖于复杂的互斥锁或信号量,而是直击问题根源——通过临时屏蔽中断来消除竞争条件的物理可能性。这种设计在资源受限的 MCU 上具有极高的效率优势,但同时也对使用者提出了明确的要求:临界段必须足够短,且其内部严禁调用任何可能引起阻塞或调度的 API