Каков механизм, используемый для сохранения регистра состояния sreg в микроконтроллере AVR? RETI
подразумевает, что эти биты не находятся в стеке. Является ли один из регистров общего назначения также спрегом или что-то в этом роде?Сохранение sreg в прерываниях AVR
8
A
ответ
11
Это объясняется в каждом техническом описании 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
Для получения дополнительной информации смотрите here.
1
Альтернативно
PUSH Rn
LDS Rn, SREG
PUSH Rn
и
POP Rn
STS SREG, Rn
POP Rn
кажется действительным.
Реестр состояния не является регистром общего назначения. Он находится в файле регистра ввода-вывода и может быть доступен с помощью команд 'in' и' out'. –