参考教程:【正点原子】手把手教你学UCOS-III实时操作系统_哔哩哔哩_bilibili
一、临界段代码保护
1、临界段代码保护简介
(1)临界段代码也叫做临界区,是指那些必须完整运行,不能被打断的代码段。
(2)临界段适合于需严格按照时序的场合,如软件通信协议的实现,如果其实现过程中被中断打断,将会扰乱时序,从而引发通讯错误。
(3)临界区外,中断与任务调度可以打断当前程序的运行,而临界区内直接屏蔽了中断(实际上,任务调度也是依靠中断实现的)。
2、临界段代码保护函数介绍
(1)µC/OS-III在进入临界段代码的时候需要关闭中断,当处理完临界段代码以后再打开中断。
函数 | 描述 |
CPU_CRITICAL_ENTER( ) | 进入临界段 |
CPU_CRITICAL_EXIT( ) | 退出临界段 |
(2)临界段代码保护函数使用方法:
CPU_SR_ALLOC();
/* 非临界区代码 */
CPU_CRITICAL_ENTER() ;
{
… … /* 临界区代码 */
}
CPU_CRITICAL_EXIT() ;
/* 非临界区代码 */
(3)以上两个函数需要成对使用,且不支持嵌套使用。
二、任务调度锁
1、任务调度锁简介
(1)任务调度锁用于对调度器上锁以及解锁,当调度器上锁时则禁止任务调度(也即挂起任务调度器),当解锁时则允许任务调度(也即恢复任务调度器)。
(2)调度锁只是将调度器关闭,并不影响中断的执行,中断依旧正常触发,只是不会执行任务切换。
2、任务调度函数介绍
(1)函数概览:
函数 | 描述 |
OSSchedLock(OS_ERR *p_err) | 挂起任务调度器 |
OSSchedUnlock (OS_ERR *p_err) | 恢复任务调度器 |
(2)任务调度器挂起和恢复函数使用方法:
OS_ERR err ;
OSSchedLock(&err); /* 调度器上锁 */
{
/* 操作代码 */
}
OSSchedUnlock(&err); /* 调度器解锁 */
(3)以上两个函数需要成对使用,且支持嵌套使用。