首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在AVR中断中保留sreg

在AVR中断中保留sreg
EN

Stack Overflow用户
提问于 2012-01-18 04:48:44
回答 2查看 13.4K关注 0票数 8

在AVR微控制器中用来保存状态寄存器sreg的机制是什么?RETI意味着这些位不在堆栈上。通用寄存器中是否也有sreg或类似的寄存器?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-18 17:24:55

这在每个AVR数据表中都有解释。例如,在ATtiny2313 datasheet的第8页上,它说:

进入中断例程时,状态寄存器不会自动存储,从中断返回时,状态寄存器不会恢复。这必须由软件来处理。

您可以通过将其存储在临时寄存器中来实现此目的:

代码语言:javascript
复制
 interrupt:
     in r16, SREG   ; save SREG

     ...

     out SREG, r16  ; restore SREG
     reti

还要注意,如果访问的寄存器不是此中断例程中独占使用的寄存器,则还需要保存这些寄存器。此外,如果寄存器较少,则可以将SREG的值推送到堆栈:

代码语言:javascript
复制
 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

票数 13
EN

Stack Overflow用户

发布于 2015-08-14 14:25:12

另一个选择

代码语言:javascript
复制
PUSH Rn
LDS Rn, SREG
PUSH Rn

代码语言:javascript
复制
POP Rn
STS SREG, Rn
POP Rn

似乎是正确的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8901543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档