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()注意要成对使用。