临界段代码(critical sections)

又叫做临界区(critical region),是指那些必须完整运行,不可被打断的代码段。

  • 中断处理程序和任务都会访问临界段代码,需要用关中断的方法加以保护;
  • 仅由任务访问的临界段代码,可以通过给调度器上锁的方法来保护。

关中断

OS_CFG_ISR_POST_DEFERRED_EN 设置为0

测量中断关闭时间

从关闭中断时开始计算,到重新打开时结束。

更新两个变量,通过查看这两个变量可以系统和特定任务进行优化。

  • 总的中断关闭时间
  • 单个任务的中断关闭时间

给调度器上锁

OS_CFG_ISR_POST_DEFERRED_EN 设置为1

测量调度器锁定时间

从给调度器上锁时开始计算,到给调度器解锁时结束。
更新两个时间,通过查看每个任务的调度锁定事件,可以堆系统和特定任务进行优化。

  • 总的调度锁定时间
  • 单个任务的调度锁定时间

某些功能会导致临界段代码长度增加

功能

导致临界段代码边长的原因

多任务具有相同的优先级

不使用相同优先级推荐使用关中断方法

事件标志组

多个任务在等待多个事件,遍历这些任务和事件会花费相当长时间,导致临界段代码边长。 建议小于5个小任务等待一个时间标志组,可以使用关中断方法。

等待多个内核对象

会极大增大关中断时间,最好使用给调度器上锁方式

以广播方式发送消息或者信号量

以广播方式向多个任务发送消息或者信号量时,需要关中断;不适用广播方式选项时,可以采用关中断方式保护临界段代码。