2012-01-17 2 views
8

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

+1

Реестр состояния не является регистром общего назначения. Он находится в файле регистра ввода-вывода и может быть доступен с помощью команд 'in' и' out'. –

ответ

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 

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

 Смежные вопросы

  • Нет связанных вопросов^_^