割り込み 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
。その意図が非常に明確だからです。これらは、コア インクルード ファイルの定義によって実装されます。