Сохранение sreg в прерываниях AVR - PullRequest
8 голосов
/ 18 января 2012

Какой механизм используется для сохранения регистра состояния, sreg, в микроконтроллере AVR? RETI подразумевает, что эти биты не находятся в стеке. Является ли один из регистров общего назначения sreg или что-то в этом роде?

Ответы [ 2 ]

12 голосов
/ 18 января 2012

Это объясняется в каждой таблице AVR.Например, на странице 8 таблицы ATtiny2313 написано:

Регистр состояния не сохраняется автоматически при вводе подпрограммы прерывания и восстанавливается при возврате из прерывания.Это должно обрабатываться программным обеспечением.

Этого можно добиться, сохранив его во временном регистре:

 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

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

1 голос
/ 14 августа 2015

В качестве альтернативы

PUSH Rn
LDS Rn, SREG
PUSH Rn

и

POP Rn
STS SREG, Rn
POP Rn

кажется действительным.

...