2

Arduino(Avr)に、このコードで使用されている変数にも作用する割り込みによって中断されることなく実行したいコードがあります。コードの実行中にその割り込みが失われることは望ましくありません。むしろ、割り込みを少し延期してもらいたいです。すべての割り込みではなく、この1つの割り込みのみを延期したいと思います。

現在、その割り込みマスクをクリアし、コードの終了後に再度設定しています。これは稼働していますか?コードは次のようになります。

その割り込み(この場合はtimer1オーバーフロー割り込み)によって中断されたくないコードの一部:

  TIMSK1 = 0; //Set Timer1 Mask off. Just postponed ???? I hope so.
  int c = buffer[reading_pointer]; 
  reading_pointer = (reading_pointer + 1)%SIZE_OF_BUFFER;
  something_on_buffer = false;
  //buffer and something_on_buffer are set on Timer1 interrupt. 
  TIMSK1 |= (1 << TOIE1); //Enable timer1 again.

something_on_bufferbufferTimer1にも設定されているため、このコードのバッファの読み取りと設定の途中で割り込みが実行されると競合が発生しsomething_on_bufferます。そのため、この数行のコードでTimer1の割り込みを延期したいと思います。念のために。これを行う方法?これは正しい方法ですか?

4

1 に答える 1

0

あなたのアプローチはうまく見えます。

一般に、プロセッサには、割り込み用のフラグレジスタと、割り込みを有効にするためのレジスタがあります。各ステップで、プロセッサはフラグとフラグをチェックし、ビットを有効にして、割り込みを実行する必要があるかどうかを確認します。つまり、設定フラグが割り込みの実行を誘導する場合にのみ、イネーブルビットはフラグが設定されるかどうかを制御しません。

ビットを設定して割り込みを有効にし、フラグがすでに設定されている場合、割り込みは次のマシン命令の前に実行されます。

割り込みが有効になっていない場合でも、条件によってフラグビットを設定できます。

于 2012-12-02T03:58:51.947 に答える