wangxj_nemo 发表于 2010-10-8 15:46:43

关于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]
查看完整版本: 关于OS_ENTER_CRITICAL和OS_EXIT_CRITICAL!