首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解用于禁用和恢复SREG中断状态的AVR代码

理解用于禁用和恢复SREG中断状态的AVR代码
EN

Stack Overflow用户
提问于 2021-04-28 21:37:56
回答 1查看 452关注 0票数 0

对于如何禁用和恢复我为8位AVR处理器找到的中断状态,我有些困惑。

像ATmega 2560这样的8位AVR处理器在状态寄存器(SREG)中有一个全局中断启用位(标签为'I')。CLI指令通过清除该位禁用所有中断。来自AVR指令集手册:

CLI -清除全局中断启用位 描述 清除SREG (状态寄存器)中的全局中断启用(I)位。中断将立即被禁用。即使中断与CLI指令同时发生,也不会在CLI指令之后执行中断。(相当于指令BCLR 7)

AVR指令集手册还显示了以下示例:

代码语言:javascript
复制
1   in temp, SREG      ; Store SREG value (temp must be defined by user)
2   cli                ; Disable interrupts during timed sequence
3   sbi EECR, EEMWE    ; Start EEPROM write
4   sbi EECR, EEWE
5   out SREG, temp     ; Restore SREG value (I-flag)

第5行的目的似乎是将SREG的i标志恢复到执行第2行之前的值。实际上,这段代码存储了所有SREG标志的状态--它似乎只是假设SREG的其他标志的值不会在第1行和第5行之间改变。但是,如果在第1行和第2行之间发生中断,难道就不能导致SREG的其他一些标志“恢复”不正确吗?

代码语言:javascript
复制
1   in temp, SREG      ; Store SREG value (temp must be defined by user)
    ; <------- interrupt occurs here
2   cli                ; Disable interrupts during timed sequence
3   sbi EECR, EEMWE    ; Start EEPROM write
4   sbi EECR, EEWE
5   out SREG, temp     ; Restore SREG value (I-flag)
EN

回答 1

Stack Overflow用户

发布于 2021-04-29 06:36:24

  • 当中断发生时,CPU将切换到中断服务例程,但在切换之前,CPU将记住程序的位置(通过推程序计数器在堆栈中)
  • CPU将执行ISR。
  • 执行ISR后,恢复CPU环境(SERG、GPR、SP、PC)和中断前一样非常重要和关键--这将由您的代码来完成(如果中断后不恢复CPU环境,程序就会崩溃)
  • CPU将返回到同一个位置(通过从堆栈还原PC )
代码语言:javascript
复制
1   in temp, SREG      ; Store SREG value (temp must be defined by user)
    ; <------- interrupt occurs here
    ; <-------------go to interupt  handler
    ; <--------Rutern from interupt with same value of temp, SREG, and all GPR are same value 

2   cli                ; Disable interrupts during timed sequence
3   sbi EECR, EEMWE    ; Start EEPROM write
4   sbi EECR, EEWE
5   out SREG, temp     ; Restore SREG value (I-flag)

上面的代码简单地告诉您“确保行3,4将在没有中断的情况下彼此执行”。

如果在第1行和第2行之间发生了中断,难道不会导致SREG的其他一些标志“恢复”不正确吗?

如果中断发生在第1行和第2行之间,中断将在第2行之前处理并返回,任何中断代码都必须保留CPU环境。

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

https://stackoverflow.com/questions/67308257

复制
相关文章

相似问题

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