关于OS_ENTER_CRITICAL和OS_EXIT_CRITICAL!
OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()定义如下:#defineOS_ENTER_CRITICAL()(cpu_sr = OS_CPU_SR_Save()) /* Disable interrupts */
#defineOS_EXIT_CRITICAL() (OS_CPU_SR_Restore(cpu_sr)) /* Enableinterrupts
而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里面去。
页:
[1]