2016-06-16 13 views
0

小さなCプログラム用のアセンブリ生成コードavr-gccを見ています。以下は、スタック上に100バイトのローカル配列を割り当てることになっています。Avrアセンブリプログラミング:スタック上のアトミック割り当て

extern void foo(char [], int); 

void bar() 
{ 
    char t[100]; 
    foo(t,100); 
} 

そして、もちろん、スタックポインタから100を引くことによって行います。

avrは8ビットマシンなので、16ビットスタックポインタを変更するには2つのステップが必要です(SPHとSPLの変更)。また、割り込みを無効にすることによって、ある程度のアトミック性を提供することは良い考えです。それはシーケンスによって行われます

in r28,__SP_L__ 
in r29,__SP_H__   ; get SP 
subi r28,100    ; new SP in R29:R28 = OLD -100 
sbc r29,__zero_reg__ 
in __tmp_reg__,__SREG__ ; save status to r0 
cli      ; disable interrupts 
out __SP_H__,r29   ; update SPH 
out __SREG__,__tmp_reg__ ; restore status -- why here ? 
out __SP_L__,r28   ; update SPL 

復元ステータス命令の位置はまだわかりません。

なぜはありませんはSPLをアップデートした後に完了しますか?

割り込みを有効にした後で、次の命令が完了する前に割り込みがアカウントに取り込まれないという保証はありますか?

答えて

5

あなたが正しいようです。
私は決定的な情報源を見つけることができず、どちらの人もElectrical Engineeringにいる人はどちらも明らかににいることができません。 SREG(ステータスレジスタ)でグローバル割り込みフラグ(I)を設定します

我々が得た最も近いsei命令のAVR ISA manualから、この文です。 SEIに続く命令は、保留中の割り込みの前に実行されます。今

、EEサイトに疑問として、これはそれが多分アーキテクチャ自体の機能sei命令自体の特徴でもよいが。

あなたはオペコードseiを見れば、実際にちょうどbset 7ですが、保留中の割り込みについての注釈がちょうどseiような演技bset 7にもかかわらず、bsetページ内に存在しません。
は、だから私はあなたがoutseiを使用するときSREGI-ビットを設定すると、1つの以上の命令に対する割り込みマスクと確信しています。

リンクされた質問の詳細:AVR sei instruction


リンクの質問は、この偽のものを好きではない、それは実際の答えが含まれている、あなたと同じです。
つまり、変更方法はカウントされません。​​3210
再リンクされました。

関連する問題