1.1 临界段

临界段:也叫临界区,一旦这部分代码开始执行,则不允许任何中断打断。为确保临界段代码 的执行不被中断,在进入临界段之前须关中断,而临界段代码执行完毕后,要立即开中断。

FreeRTOS 源码中就有多处临界段的处理,跟 FreeRTOS 一样,uCOS-II 和 uCOS-III 源码中都是有 临界段的,而 RTX 的源码中不存在临界段。

临界段:

  • 读取或者修改变量(特别是用于任务间通信的全局变量)的代码,一般来说这是最常见的临界代码。
  • 调用公共函数的代码,特别是不可重入的函数,如果多个任务都访问这个函数,结果是可想而知的。 总之,对于临界段要做到执行时间越短越好,否则会影响系统的实时性。

1.2 任务代码临界段处理

进入和退出临界区的方法

#define taskENTER_CRITICAL() portENTER_CRITICAL()
#define taskEXIT_CRITICAL() portEXIT_CRITICAL()

1.3 中断服务程序临界段处理

#define taskENTER_CRITICAL_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR()

#define taskEXIT_CRITICAL_FROM_ISR( x ) portCLEAR_INTERRUPT_MASK_FROM_ISR( x )

1.4 开关中断的实现

和1.2一样,区别就是不支持中断嵌套

#define taskDISABLE_INTERRUPTS() portDISABLE_INTERRUPTS()

#define taskENABLE_INTERRUPTS() portENABLE_INTERRUPTS()

1.5 BSP 板级支持包中开关中断的特别处理

驱动里面的处理