26

私はArduinoUnoを持っています(素晴らしい小さなデバイスです!)。2つの割り込みがあります。それらを01と呼びましょう。attachInterrupt()http://www.arduino.cc/en/Reference/AttachInterruptを使用して、割り込み0にハンドラーをアタッチし、割り込み1に別のハンドラーをアタッチします

割り込み0がトリガーされ、ハンドラーが呼び出されます。ハンドラーは、数値の処理を行います。割り込み1がトリガーされたときに割り込み0のハンドラーがまだ実行されている場合、どうなりますか?

割り込み1は割り込み0を中断しますか、それとも割り込み1は割り込み0のハンドラーの実行が完了するまで待機しますか?

この質問は特にArduinoに関連していることに注意してください。

4

3 に答える 3

28

Arduino(別名AVR)ハードウェアでは、意図的に条件を作成して発生させない限り、ネストされた割り込みは発生しません。

avr-libから:

AVRハードウェアは、割り込みベクタを入力する前に、SREGのグローバル割り込みフラグをクリアします。したがって、通常、割り込みはハンドラーが終了するまでハンドラー内で無効のままになり、RETI命令(割り込みハンドラーの通常の関数エピローグの一部としてコンパイラーによって発行される)は、最終的にさらに割り込みを再度有効にします。そのため、通常、割り込みハンドラはネストしません。ほとんどの割り込みハンドラーでは、これが望ましい動作です。無限に再帰的な割り込み(UART割り込み、レベルトリガー外部割り込みなど)を防ぐために必要な場合もあります。まれな状況ですが、絶対に必要な以上の他の割り込みを延期しないために、割り込みハンドラでできるだけ早くグローバル割り込みフラグを再度有効にすることが望ましい場合があります。

(ソース: http: //linux.die.net/man/3/avr_interrupts

于 2011-02-24T22:44:58.513 に答える
7

割り込み 1 は割り込み 0 に割り込みますか、それとも割り込み 0 のハンドラーの実行が完了するまで割り込み 1 を待ちますか?

ISR (割り込みサービス ルーチン) 内で割り込みを明確に再度有効にしない限り、次の割り込みが処理される前に、現在実行中の割り込みが完了し、さらにもう 1 つのマシン コード命令が実行されます。

ほとんどの割り込みは、割り込みを処理する必要があるかどうかを確認するために、命令間でチェックされるプロセッサ内にフラグを設定します。フラグは優先順位に従ってチェックされます。Uno の場合:

 1  Reset 
 2  External Interrupt Request 0  (pin D2)          (INT0_vect)
 3  External Interrupt Request 1  (pin D3)          (INT1_vect)
 4  Pin Change Interrupt Request 0 (pins D8 to D13) (PCINT0_vect)
 5  Pin Change Interrupt Request 1 (pins A0 to A5)  (PCINT1_vect)
 6  Pin Change Interrupt Request 2 (pins D0 to D7)  (PCINT2_vect)
 7  Watchdog Time-out Interrupt                     (WDT_vect)
 8  Timer/Counter2 Compare Match A                  (TIMER2_COMPA_vect)
 9  Timer/Counter2 Compare Match B                  (TIMER2_COMPB_vect)
10  Timer/Counter2 Overflow                         (TIMER2_OVF_vect)
11  Timer/Counter1 Capture Event                    (TIMER1_CAPT_vect)
12  Timer/Counter1 Compare Match A                  (TIMER1_COMPA_vect)
13  Timer/Counter1 Compare Match B                  (TIMER1_COMPB_vect)
14  Timer/Counter1 Overflow                         (TIMER1_OVF_vect)
15  Timer/Counter0 Compare Match A                  (TIMER0_COMPA_vect)
16  Timer/Counter0 Compare Match B                  (TIMER0_COMPB_vect)
17  Timer/Counter0 Overflow                         (TIMER0_OVF_vect)
18  SPI Serial Transfer Complete                    (SPI_STC_vect)
19  USART Rx Complete                               (USART_RX_vect)
20  USART, Data Register Empty                      (USART_UDRE_vect)
21  USART, Tx Complete                              (USART_TX_vect)
22  ADC Conversion Complete                         (ADC_vect)
23  EEPROM Ready                                    (EE_READY_vect)
24  Analog Comparator                               (ANALOG_COMP_vect)
25  2-wire Serial Interface  (I2C)                  (TWI_vect)
26  Store Program Memory Ready                      (SPM_READY_vect)

(リセットはマスクできないことに注意してください)。

低レベルの割り込みが進行中である可能性があります (例: TIMER0_OVF_vect)。それが忙しい間、他の複数の割り込みイベントが発生する可能性があります(そしてCPUの対応するビットを設定します)。これらは、実際に時間内に発生する順序ではなく、上記の順序でサービスされます。

保留中の割り込みをキャンセルするために、つまりフラグをクリアするために、書き込むことができるハードウェア レジスタがあります。


「もう1つのマシンコード命令」に言及する理由は、プロセッサが、割り込みが有効になっていない状態から割り込みが有効になっている状態に移行するときに、常にもう1つの命令が実行されることを保証するように設計されているためです。

これにより、次のようなコードを記述できます。

  interrupts ();             // guarantees next instruction executed
  sleep_cpu ();              // sleep now

そうしないと、スリープに入る前に割り込みが発生する可能性があります。つまり、スリープ前ではなくスリープ中に発生する割り込みに依存していたため、決して起きません。


Freescale と Atmel の両方がまったく同じ命令名を使用しているのに、意味が逆になっているのは、なんて馬鹿げたことでしょう。

interruptsそのため、私はandのニーモニックを好みますnoInterrupts。その意図が非常に明確だからです。これらは、コア インクルード ファイルの定義によって実装されます。

于 2016-03-07T06:47:25.147 に答える
1

ドキュメントには、Arduino 割り込みが優先されることが記載されています。

スケッチで複数の ISR を使用している場合、一度に実行できるのは 1 つだけです。他の割り込みは、現在の割り込みが終了した後に、優先度に応じた順序で実行されます。

また、追加情報へのリンクも提供します。

割り込みの詳細については、Nick Gammon のメモを参照してください。

セクションによると、割り込み優先度とは何ですか? 割り込みが禁止されている間に割り込みが発生する可能性はありますか? 、次のように結論付けることができます。

  1. 割り込みは、フラグのリストに基づいています。イベントが発生すると、対応するフラグが設定されます。
  2. フラグが保存されているため、ISR をすぐに起動できない場合は、後でいつでも呼び出すことができます。
  3. 利用可能なすべての割り込みのリストがあり、通常はチップによって異なります。リストの上位にあるほど、優先順位が高くなります。

そのため、異なる割り込みが互いに割り込むことはありません。それらは優先度に従って実行されます。

于 2016-02-03T08:42:58.183 に答える