首页 > 技术文章 > STM32F104ZET6之ucosⅢ临界区保护

risesource 2019-11-28 23:18 原文

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

推荐阅读