割込み処理の注意点②

【多重割込みは極力避けましょう】

多重割込みとは,割込み処理中にさらに他の割込みが発生し,入れ子状態(ネストともいいます)で他の割込み処理が行われることをいいます。以下のようなイメージです。

前述したように,割込みが発生した場合に,以下のレジスタの退避を行いますが,

 ・現在のプログラムカウンタ(PC)を割込み退避用のレジスタ(ELR)に退避

 ・現在のCPUの内部状態(PSW)を割込み退避用のレジスタ(EPSW)に退避

 ・汎用レジスタをスタックに退避

多重割込みが発生した場合も同様に,上記の退避を行います。

ここで,ELRとEPSWに着目すると,多重割込みが発生した場合,ELRとEPSWが上書きされてしまいます。このため,多重割込みを可能とするためには,割込み処理の最初でELRとEPSWをスタックに退避することが必要となります。さらに汎用レジスタもスタックに退避しなければなりません。

つまり,多重割込みを可能とすると,割込みがネストするたびに消費されるスタックが増加していきます。

割込みはどこで発生するか分からないので,スタックをどれだけ使うかを検証するのは難しいですし,マイコンのRAMは数Kバイトしか保有していない場合が多いので,大容量のスタック領域を確保するのも難しいと思います。

スタック領域が不足しているとスタックオーバーフローを起こしてプログラムが暴走してしまう可能性もあります。

このようなことから,多重割込みは極力避ける(割込みに入ったら割込みを禁止状態にしておく)方がよいでしょう。

 

補足ですが,ML62Q1000シリーズのマイコンでは,割込みが発生した場合,ハードウェアで割込みが自動的に禁止されます。このため,割込み処理内で明示的に割込みを許可しない限り,多重割込みになることはありません。

マイコン設計者がお答えします!技術的問い合わせフォーム