Сохранение sreg в прерываниях AVR
какой механизм используется для сохранения регистра состояния sreg в микроконтроллере AVR? RETI
подразумевает, что эти биты не на стеке. Один из регистров общего назначения и регистре sreg или что-то подобное?
2 ответов
это объясняется в каждой спецификации AVR. Например, на странице 8 ATtiny2313 datasheet Он говорит:
регистр состояния не сохраняется автоматически при вводе процедуры прерывания и не восстанавливается при возврате из прерывания. Это должно быть обработано программным обеспечением.
вы можете достичь этого, сохранив его во временном регистре:
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
для получения дополнительной информации смотрите здесь.