8

AVRマイクロコントローラーのステータスレジスタsregを保持するために使用されるメカニズムは何ですか? RETIこれらのビットがスタック上にないことを意味します。汎用レジスタの1つは、sregまたはそのようなものでもありますか?

4

2 に答える 2

13

これはすべてのAVRデータシートで説明されています。たとえば、ATtiny2313データシートの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

詳細については、こちらをご覧ください。

于 2012-01-18T09:24:54.963 に答える
1

あるいは

PUSH Rn
LDS Rn, SREG
PUSH Rn

POP Rn
STS SREG, Rn
POP Rn

有効なようです。

于 2015-08-14T06:25:12.057 に答える