2012-01-17 81 views
8

在AVR微控制器中用於保存狀態寄存器sreg的機制是什麼? RETI意味着這些位不在堆棧上。其中一個通用寄存器也是sreg或類似的東西?在AVR中斷中保留sreg

+1

狀態寄存器不是通用寄存器。它駐留在I/O寄存器文件中,可以使用'in'和'out'指令進行訪問。 – 2012-01-18 09:28:36

回答

11

這在每個AVR數據表中都有說明。例如在ATtiny2313 datasheet的第8頁上,它表示:

狀態寄存器在進入中斷例程時不會自動存儲,而在從中斷返回時不會自動存儲。這必須由軟件來處理。

您可以通過將其存儲在臨時寄存器實現這一目標:

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 

似乎是有效的。