STM32F104ZET6之ucosⅢ临界区保护
UCOSⅢ对临界区的处理方法
-
1.中断开关的方式
临界区一旦被访问,那么就关闭所有中断,防止执行过程被更高级中断打断
保证了数据的同步性,但可能会导致一些紧急事件未能及时处理
OS_ENTER_CRITICAL()简单地关中断,OS_EXIT_CRITICAL()简单地开中断。
这种方式虽然简单高效,但无法满足嵌套的情况。
如果有多层临界区保护,在退出内层临界区时就会开中断,使外层的临界区也失去保护。
不推荐使用。 -
2.压栈的方式
临界区在被访问过程中,被中断打断,就对该状态进行压栈处理,保证各个事件按等级正常运行,
但数据无法保证同步性,压栈的数据在出栈时,上次的中断可能已经修改了数据,将数据出栈没有什么意义,
不推荐使用。 -
3.保存在本地局部变量.
在关中断前,使用局部变量保存中断状态。
一般都用模式三,使用方法如下
//1.定义一个局部变量cpu_sr
CPU_SR cpu_sr = (CPU_SR)0;
//也可直接调用宏定义一个局部变量cpu_sr
//关于这个宏,在cpu.h中303行左右,如下
//#if (CPU_CFG_CRITICAL_METHOD == CPU_CRITICAL_METHOD_STATUS_LOCAL)
//#define CPU_SR_ALLOC() CPU_SR cpu_sr = (CPU_SR)0
//#else
//#define CPU_SR_ALLOC()
//#endif
//调用宏定义局部变量
//CPU_SR_ALLOC();
//2.进入临界区,关中断
OS_ENTER_CRITICAL();
printf("Hello world\r\n");
//3.退出临界区,开中断
OS_EXIT_CRITICAL();
注意:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()注意要成对使用。