在AVR微控制器中用来保存状态寄存器sreg的机制是什么?RETI意味着这些位不在堆栈上。通用寄存器中是否也有sreg或类似的寄存器?
发布于 2012-01-18 17:24:55
这在每个AVR数据表中都有解释。例如,在ATtiny2313 datasheet的第8页上,它说:
进入中断例程时,状态寄存器不会自动存储,从中断返回时,状态寄存器不会恢复。这必须由软件来处理。
您可以通过将其存储在临时寄存器中来实现此目的:
interrupt:
in r16, SREG ; save SREG
...
out SREG, r16 ; restore SREG
reti还要注意,如果访问的寄存器不是此中断例程中独占使用的寄存器,则还需要保存这些寄存器。此外,如果寄存器较少,则可以将SREG的值推送到堆栈:
interrupt:
push r16 ; save global registers on stack
push r17
push r18
in r16, SREG ; save SREG
push r16 ; do this if you want to use r16 in your interrupt routine
...
pop r16 ; do this if you pushed SREG above
out SREG, r16 ; restore SREG
pop r18 ; restore global registers
pop r17
pop r16
reti有关更多信息,请查看here。
发布于 2015-08-14 14:25:12
另一个选择
PUSH Rn
LDS Rn, SREG
PUSH Rn和
POP Rn
STS SREG, Rn
POP Rn似乎是正确的。
https://stackoverflow.com/questions/8901543
复制相似问题