2013-07-16 9 views
5

私はatmega168a-puと割り込みでCアプリケーションを開発します。私は、次の割り込みを使用します。私は、割り込みが発生したときに他のすべての割り込みをブロックし、ちょうど割り込み機能を終了する前に割り込みを有効にしたいAVRプログラミング、割り込み処理

int main(void){ 
///initialization etc. 
    sei(); 
    while(1){ 
    ///do some stuff and wait the interrupts 
    } 
return 0; 
} 

よう

ISR(TIMER0_COMPA_vect); 
ISR(TIMER0_COMPB_vect); 
ISR (TIMER2_COMPA_vect); 
ISR(SPI_STC_vect); 
ISR(TIMER1_COMPA_vect); 
ISR (PCINT1_vect); 

と私のコードが見えます。

私はそれをどのように行うことができるのかをコードスニペットで説明できますか?

EDIT:http://www.nongnu.org/avr-libc/user-manual/optimization.html#optim_code_reorderは、このような使用が再配置の問題を引き起こすと述べています。

function(){ 
    cli(); 
    .. 
    sei(); 
} 

答えて

2

私はここに掲載前の回答は、AVR-GCCの並べ替え問題に言及していない、元の質問に基づいていました。明らかにそれはあまりにも長い前に、私はAVRで働いていたが、割り込み

質問への改訂回答

アトメルを中断さからの割り込みを守る無効に関するリンギング鐘があったということです

割り込みが発生すると、グローバル割り込みイネーブルIビットがクリアされ、すべてのinteビットがクリアされます。破損は無効になります。 ユーザーソフトウェアは、ネストされた割り込みを有効にするためにIビットに論理1を書き込むことができます。すべてのイネーブルされた 割り込みは、現在の割り込みルーチンを中断することができます。 Iビットは、 割り込みからのリターン命令 - RETI - が実行されると自動的にセットされます。

したがってあなたが求める動作は、すでにハードウェアで実装されています。

並べ替え問題

私も、この並べ替え問題に関するいくつかの調査をしました。明らかに、これがコンパイラのエラーであるかどうかには大きな違いがあります。並べ替えの主なリスクは、割り込みが期待されるよりも長い時間無効にされるということです。私の研究では、実際には選択肢ではないロード/ストアのアクティビティを増やすソリューション以外の解決策は見つかりませんでした。

+0

グローバル割り込みをどのように無効にして有効にしても問題はありませんか? –

+0

downvotersはdownvoteを説明してくださいか? Johanは投稿後約8分後にバグの説明にヒントを追加しました。 – junix

+0

@JohanElmander変更された質問に対する回答を更新しました。 – junix

1

割り込みのデフォルトの動作は、割り込みが処理されている間は新しい割り込みが(起動されないように)無効になるためです。

中断してはいけないコードの記述に関しては、一般的には<util/atomic.h>のアトミック機能を使用するだけで十分です。これでは十分ではなく、実際にはでなければなりません。再配列がないことを確認して、おそらくアセンブリのクリティカルセクションを書き込むことができます。

メモリバリアを使用してをコードセクション内のすべてにすることは可能ですが、それは多くの場合非常に大きなペシムイズになります。これによって生成されたアセンブリは、手作業でアセンブリを書く場合に書いたものを示唆しているかもしれません。

関連する問題