|
OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()定义如下:
#define OS_ENTER_CRITICAL() (cpu_sr = OS_CPU_SR_Save()) /* Disable interrupts */
#define OS_EXIT_CRITICAL() (OS_CPU_SR_Restore(cpu_sr)) /* Enable interrupts
而OS_CPU_SR_Save()和OS_CPU_SR_Restore(cpu_sr)的定义是汇编的,如下:
OS_CPU_SR_Save: IN R16,SREG ; Get current state of interrupts disable flag
CLI ; Disable interrupts
RET ; Return original SREG value in R16
OS_CPU_SR_Restore: OUT SREG,R16 ; Restore SREG
RET ; Return
然后查看AVR汇编指令集RET指令只是栈顶数据恢复到PC里面去,请问OS_CPU_SR_Save里面的RET指令怎么就把SREG存到了cpu_sr里面去了呢?第二个可以理解,OS_CPU_SR_Restore(cpu_sr)调用时,cpu_sr按编译规则作为第一个参数放到R16里面,然后传到SREG里面去。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|