为什么 会有这句话 ‘#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();

这段代码是uC/OS-II操作系统中的一部分。主要涉及到操作系统中关于中断和临界区的处理。下面是对每个部分的解释: 1. `#define OS_CRITICAL_METHOD 3`:定义临界区保护方法。在本例中,使用了方法3,即使用汇编代码实现保护。 2. `#if OS_CRITICAL_METHOD == 3`:根据定义的保护方法选择不同的临界区保护方式。 3. `#define OS_ENTER_CRITICAL() {cpu_sr = OS_CPU_SR_Save();}`:定义进入临界区的宏,其中`OS_CPU_SR_Save()`是一个汇编函数,用于保存CPU状态寄存器的值,并关闭中断。 4. `#define OS_EXIT_CRITICAL() {OS_CPU_SR_Restore(cpu_sr);}`:定义退出临界区的宏,其中`OS_CPU_SR_Restore(cpu_sr)`是一个汇编函数,用于恢复CPU状态寄存器的值,并打开中断。 5. `void OSCtxSw(void)`:任务切换函数,用于把当前任务切换到下一个就绪任务。 6. `void OSIntCtxSw(void)`:中断切换函数,用于在中断服务程序中切换任务。 7. `void OSStartHighRdy(void)`:启动系统,从最高优先级的任务开始执行。 8. `void OSPendSV(void)`:处理中断服务程序中的软件中断请求。 9. `#if OS_CRITICAL_METHOD == 3u`:同2。 10. `OS_CPU_SR OS_CPU_SR_Save(void)`:保存CPU状态寄存器的值,并关闭中断。 11. `void OS_CPU_SR_Restore(OS_CPU_SR cpu_sr)`:恢复CPU状态寄存器的值,并打开中断。 12. `OS_CPU_EXT INT32U OSInterrputSum`:定义了一个全局变量,用于统计中断的次数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值