临界段代码(critical sections)
又叫做临界区(critical region),是指那些必须完整运行,不可被打断的代码段。
- 中断处理程序和任务都会访问临界段代码,需要用关中断的方法加以保护;
- 仅由任务访问的临界段代码,可以通过给调度器上锁的方法来保护。
关中断
OS_CFG_ISR_POST_DEFERRED_EN 设置为0
测量中断关闭时间
从关闭中断时开始计算,到重新打开时结束。
更新两个变量,通过查看这两个变量可以系统和特定任务进行优化。
- 总的中断关闭时间
- 单个任务的中断关闭时间
给调度器上锁
OS_CFG_ISR_POST_DEFERRED_EN 设置为1
测量调度器锁定时间
从给调度器上锁时开始计算,到给调度器解锁时结束。
更新两个时间,通过查看每个任务的调度锁定事件,可以堆系统和特定任务进行优化。
- 总的调度锁定时间
- 单个任务的调度锁定时间
某些功能会导致临界段代码长度增加
功能 | 导致临界段代码边长的原因 |
多任务具有相同的优先级 | 不使用相同优先级推荐使用关中断方法 |
事件标志组 | 多个任务在等待多个事件,遍历这些任务和事件会花费相当长时间,导致临界段代码边长。 建议小于5个小任务等待一个时间标志组,可以使用关中断方法。 |
等待多个内核对象 | 会极大增大关中断时间,最好使用给调度器上锁方式 |
以广播方式发送消息或者信号量 | 以广播方式向多个任务发送消息或者信号量时,需要关中断;不适用广播方式选项时,可以采用关中断方式保护临界段代码。 |