uCOS-III开关中断进出临界区的三个宏

* 1. 临界区解释:
* 代码的临界短也称为临界区,指处理时不可分割的代码。一旦这部分代码开始执行,则不允许
* 任何中断打入。为确保临界段代码的执行不被中断,在进入临界段之前必须关中断,而临界段
* 代码执行完后,要立即开中断。
* 2. uCOS-III中有两种进入临界区方式和一种开关中断方式。下面简单说明:
* 注意,临界区的处理方式采用的方式3,即CPU_CRITICAL_METHOD_STATUS_LOCAL,在cpu.h文件定义。
* 下面三组函数都是支持嵌套调用的。
* (1)开关中断(通过寄存器PRIMASK实现全局中断的开关): 
* CPU_INT_DIS(); 关闭中断 
* 防止被中断打断的代码
* CPU_INT_EN(); 打开中断 
* ---这两个函数支持嵌套调用
*
* (2)进入临界段和退出临界段方式一, 在cpu.h文件定义 
* 临界区设置里面也有开关中断操作的,并且支持开关中断的嵌套使用
* CPU_CRITICAL_ENTER(); 进入临界区 
* 临界区代码
* CPU_CRITICAL_EXIT() ; 推出临界区

* 这两个函数跟上面CPU_INT_DIS和CPU_INT_EN的区别是:
* a. 如果没有使能宏定义CPU_CFG_INT_DIS_MEAS_EN。
* #define CPU_CRITICAL_ENTER() do { CPU_INT_DIS(); } while (0) 
* #define CPU_CRITICAL_EXIT() do { CPU_INT_EN(); } while (0) 
* 两者一样。
* b. 如果使能就开启测量功能。
* #define CPU_CRITICAL_ENTER() do { CPU_INT_DIS(); \
* CPU_IntDisMeasStart(); } while (0) 
* #define CPU_CRITICAL_EXIT() do { CPU_IntDisMeasStop(); \
* CPU_INT_EN(); } while (0)
* 多了一个测量功能。
* c. 通过寄存器PRIMASK实现全局中断的开关。
*
* (3)进入临界段和退出临界段方式二, 在os.h文件定义
* OS_CRITICAL_ENTER(); 进入临界区 
* 临界区代码
* OS_CRITICAL_EXIT() ; 推出临界区
*
* 这两个函数跟上面CPU_CRITICAL_ENTER和CPU_CRITICAL_EXIT的区别是:
* a. 如果没有使能宏定义OS_CFG_ISR_POST_DEFERRED_EN,即中断延迟提交功能。
* #define OS_CRITICAL_ENTER() CPU_CRITICAL_ENTER()
* #define OS_CRITICAL_EXIT() CPU_CRITICAL_EXIT()
* 两者没有区别。
* b. 如果使能: 
* #define OS_CRITICAL_ENTER() \
* do { \
* CPU_CRITICAL_ENTER(); \
* OSSchedLockNestingCtr++; \
* if (OSSchedLockNestingCtr == 1u) { \
* OS_SCHED_LOCK_TIME_MEAS_START(); \
* } \
* CPU_CRITICAL_EXIT(); \
* } while (0)
*
* #define OS_CRITICAL_EXIT() \
* do { \
* CPU_CRITICAL_ENTER(); \
* OSSchedLockNestingCtr--; \
* if (OSSchedLockNestingCtr == (OS_NESTING_CTR)0) { \
* OS_SCHED_LOCK_TIME_MEAS_STOP(); \
* if (OSIntQNbrEntries > (OS_OBJ_QTY)0) { \
* CPU_CRITICAL_EXIT(); \
* OS_Sched0(); \
* } else { \
* CPU_CRITICAL_EXIT(); \
* } \
* } else { \
* CPU_CRITICAL_EXIT(); \
* } \
* } while (0)
* 从这里可以看出,如果开启了中断延迟提交,那么OS_CRITICAL_ENTER仅仅是给
* 调度器进行了枷锁,而且也是支持嵌套调用的,并没有关闭全局中断。

你可能感兴趣的:(UCOS)