对于如何禁用和恢复我为8位AVR处理器找到的中断状态,我有些困惑。
像ATmega 2560这样的8位AVR处理器在状态寄存器(SREG)中有一个全局中断启用位(标签为'I')。CLI指令通过清除该位禁用所有中断。来自AVR指令集手册:
CLI -清除全局中断启用位 描述 清除SREG (状态寄存器)中的全局中断启用(I)位。中断将立即被禁用。即使中断与
CLI指令同时发生,也不会在CLI指令之后执行中断。(相当于指令BCLR 7)
AVR指令集手册还显示了以下示例:
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的其他一些标志“恢复”不正确吗?
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)发布于 2021-04-29 06:36:24
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环境。
https://stackoverflow.com/questions/67308257
复制相似问题