为什么 会有这句话 ‘#if OS_CRITICAL_METHOD == 3 ‘??????

其实这个问题困扰了比较久,个人比较懒,就懒的管了。为什么会有这样的疑惑,也是自己见识短而已吧。

最近偶然,翻看论坛找到了相对正确的回答,可粘贴如下,如有遇到侵权行为,及时告知,谢谢!:


代码的临界段也称为临界区, 指处理时不可分割的代码。一旦这部分代码开始执行, 则不允许任何中断打入。 为确保临界段代码的执行,在进入临界段之前要关中断,而临界段代码执行完以后要立即开中断.

 ==3 的原因,主要是因为临界代码保护方式,暨OS_ENTER_CRITICAL 和OS_EXIT_CRITICAL 的实现方法有3种。

每一种方式的实现,取决于处理器的类型以及C编译器的特性。


 1)当OS_CRITICAL_METHOD= = 1时,简单实现如下: 

#define   OS_ENTER_CRITICAL()   disable_int() 

#define   OS_EXIT_CRITICAL()      enable_int() 

但这样有一个问题,如果禁止中断的情况下调用uC/OS-II功能函数,那么从功能函数返回时,中断可能变成允许的了,而实际上还是希望是禁止的。 


2)当OS_CRITICAL_METHOD= = 2时,实现如下: 

#define OS_ENTER_CRITICAL() asm(“PUSH PSW”); asm(“DI”); 

#define OS_EXIT_CRITICAL() asm(“POP PSW”); 

执行OS_ENTER_CRITICAL()时,先将中断状态保存到堆栈,然后关中断;

执行OS_EXIT_CRITICAL()时,再从堆栈中恢复原来的中断开/关状态。这种方法不会改变中断状态,避免前面的问题。 

但是,当用户使用的处理器有堆栈指针相对寻址模式时,可能出现严重错误。



3)当OS_CRITICAL_METHOD= = 3时,实现如下: 

#define OS_ENTER_CRITICAL() cpu_sr = get_processor_psw(); disable_interrupts(); 

#define OS_EXIT_CRITICAL() set_ processor_psw(cpu_sr); 

将处理器状态字保存在局部变量中。

某些编译器提供了扩展功能,用户可以得到当前处理器状态字的值,并将其保存在C函数局部变量之中。
举例,临界代码:

#define  OS_ENTER_CRITICAL()  {cpu_sr = OS_CPU_SR_Save();}
#define  OS_EXIT_CRITICAL()   {OS_CPU_SR_Restore(cpu_sr);}

#ifOS_CRITICAL_METHOD == 3 /* 为 CPU 的状态寄存器分配
内存*/
OS_CPU_SR cpu_sr;
#endif

OS_ENTER_CRITICAL();
/*临界代码*/
critical_code_process();

OS_EXIT_CRITICAL();

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值