Сохранение 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

для получения дополнительной информации смотрите здесь.


как вариант

PUSH Rn
LDS Rn, SREG
PUSH Rn

и

POP Rn
STS SREG, Rn
POP Rn

представляется правильным.