マイコンの基礎 - ノンマスカブル割り込み

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

概要

ノンマスカブル割り込み(以下、NMIという)とは、マスクできない割り込みのことである。
通常の割り込みでは、割り込み要因が発生しても、その割り込みをマスクして受け付けない設定が可能である。(マスカブル割り込み)
しかし、NMIの場合はマスクができず、NMIの割り込み要因が発生した場合には必ず割り込みを受け付ける。

NMIは、システムに致命的な障害などが発生した時に使用される。
NMIの要因が発生すると、他の割り込みを一切受け付けず、緊急事態用の割り込みハンドラが起動して、緊急事態用のソフトウェアが実行される。
Cortex-M4プロセッサでは、リセットの次に優先順位の高い例外処理として位置付けられている。(下図を参照)

NMI 1.jpg
図. Cortex-M4 例外処理のタイプと優先順位



例えば、STM32F4シリーズでは、外部から供給されるクロックが停止した場合の緊急対応システムであるCSS(Clock Security System)にNMIが割り当てられている。
CSSが起動すると、マイコンのシステムクロックが内部クロックに切り替わり、NMI用の割り込みハンドラを起動して、緊急事態用のソフトウェアが実行される。(下図を参照)

NMI 2.jpg
図. CSSの説明(STM32F4シリーズのクロックスキーム)




NMIとは

NMI以外の割り込みについては、ユーザがソフトウェアで、受け付けるか否かを設定することができる。
また、マイコンによっては、その優先順位を設定することもできる。
しかし、NMIの場合は、マスクできない構成になっており、優先順位は最上位に位置付けられる。
これは、NMIがシステムの致命的な障害などの緊急事態用に設けられた割り込みであるからである。

他の割り込みには、マスクするビットや有効化・無効化を制御するビットがあり、それをユーザがソフトウェアで制御する。
例えば、CCR(Condition Code Register)に割り込みマスクビットを持っていたり、個別に割り込みイネーブル・ディセーブルビットを持っていたりするので、
これらのビットを使って割り込みを制御する。
一方で、NMIにはそのようなビットは無く、NMIの割り込み要因が発生すると必ず受け付けられる。
(ただし、NMIの許可ビットを持っているマイコンも存在する)

また、NMIの要因の発生はシステムの致命的な障害によるため、割り込み処理の優先順位は一番高くなっている。
他の割り込みを処理していても、NMIの割り込みが優先実行されて、その間は他の割り込みを一切受け付けない。

以上が、NMIの一般的な説明であるが、実際には、マイコンによって扱いが異なる。


実際のNMIの例

市販されているマイコンのNMIの仕様において、次のような種類が挙げられる。

  1. マイコンの仕様上で決められた割り込み要因に割り当てある場合
    例えば、STM32F4シリーズのように、NMIがCSSに割り当てられており、ユーザが他の要因を選択できない場合である。

  2. NMIが外部端子に割り当てられており、ユーザが割り込み要因をハードウェアで選択できる場合
    外部にNMI用の端子を設け、ユーザがハードウェアを使用して、自由に選択できる場合である。
    これには以下の2種類がある。
    • NMI端子が専用端子の場合
    • NMI端子が汎用IOとの兼用端子の場合

  3. NMIの許可ビットがある場合
    一部のマイコンではNMIの許可ビットを持っている。

  4. NMIが無い、もしくは代替機能を持つ場合
    NMIのないマイコンも存在する。
    また、マスクできない割り込みを持っていてもNMIと呼ばず、その名称が異なるマイコンも存在する。


マイコンの仕様上で決められた割り込み要因に割り当ててある場合

STM32F4のコア(Cortex-M4)では、内蔵されているNVIC(Nested Vectored Interrupt Controller : 統合ネスト型ベクター割り込みコントローラ)が全ての割り込みを制御しており、
NMIの入力信号を受けると割り込みハンドラを起動する。
マイコンメーカーは、このNMIの入力信号にどの割り込み要因を割り当てるかを検討して、マイコンの仕様を決める。
例えば、STM32F4シリーズの場合は、CSSを割り当てている。(下図(a)を参照)

NMI 3.jpg
図. 実際のマイコンのNMI構成図



CSSは、マイコンのシステムクロックの障害を検知するシステムである。
外部からのクロック入力(HSE : High Speed External Clock Signal)の障害を検知して、内蔵発振回路(HSI : High Speed Internal Clock Signal)のクロックに切り替え、
同時にNMIハンドラを起動する機能である。マイコンでは、システムクロックの障害は致命的な障害なので、NMIを割り当てている。

一方、NVICのNMI入力信号はマイコンメーカーが自由に割り当てできるため、各マイコンで最も致命的な障害を何と考えるかで、割り当て項目が変わる。
例えば、ウォッチドッグタイマのオーバーフローを割り当てているマイコンもある。
ウォッチドッグタイマは、マイコンの暴走を監視するタイマなので、これも致命的な要因と言える。
マイコンの暴走をウォッチドッグタイマで検知して、NMIを起動して、データのバックアップとプログラムの初期化等を行う。(上図(b)を参照)

ちなみに、STM32F4シリーズのウォッチドッグタイマは、NMIよりも優先順位の高い例外処理のリセットに割り当てられている。
マイコンによっては、ウォッチドッグタイマのオーバーフローをNMIに割り当てるかリセットに割り当てるかを選択できるものも存在する。

NMIが外部端子に割り当てられていて、ユーザが割り込み要因をハードウェアで選択できる場合

NMIを外部割り込みに割り当てて、端子から割り込み要因を入力するマイコンも存在する。
この場合、ユーザがNMIの要因をハードウェアで決めることになる。

一般的なマイコンもCortex-M4のNVICと同じような割り込みコントローラを内蔵しており、端子からNMIの割り込み要因を入力する場合には、
端子と割り込みコントローラを接続して、NMIの入力信号を割り込みコントローラが処理する構成になる(下図を参照)

使用例として、「タンパ検知」が挙げられる。マイコンの機能に「タンパ検知」が無い場合、NMIを使用することができる。
「タンパ検知」もシステムにとって致命的な障害ですので、他のエラーや割り込みよりも優先して受け付けられなければならない。
また、ソフトウェアの暴走によってマスクされてしまうことを防げるため、NMIは「タンパ検知」の割り込みに適している。

※参考ページ

  • タンパ検知
  • 耐タンパ
NMI 4.jpg
図. NMIが端子に割り当てられている場合



NMI端子が専用端子の場合

NMIの性質上、一般的に、NMI端子は専用端子に割り当てられており、他の機能と兼用されていない。(上図(a)を参照)

NMI端子が汎用IOとの兼用端子の場合

マイコンによって、端子の使用範囲を広くするために、NMI端子が汎用IOとの兼用端子になっている場合があり、
ユーザがNMI端子に設定しているつもりでも、何かの間違いで汎用IO端子になってしまうことがある。
この場合、NMIを受け付けない状態になり、致命的な障害を検知することができないため、必ず端子がNMIになっていることを確認すること。

また、端子の初期値の機能も確認する必要がある。
初期値が汎用IOになっている場合は、ソフトウェアでNMIに切り替える必要がある。
この場合、端子機能が切り替わるまではNMIは使用できない。

NMIの許可ビットがある場合

通常、NMIには許可ビットが存在しないことが多いが、NMIの許可ビットを持ち、設定をしないとNMIが使用できないマイコンも存在する。
この場合、マイコンの起動からNMIの許可ビットを設定するまで、NMIが使用できない。

NMIが無い、もしくは代替機能を持つ場合

コストを重視して機能を最小限にしたマイコンでは、NMI機能が存在しない場合もある。
この場合、最も優先順位の高い割り込みをNMIの代わりとして使用することになる。

また、NMIと同じようにマスクできない割り込みを持っていても、NMIと若干仕様が異なる場合がある。
例えば、8ビットマイコンであるSTM8SファミリのSTM8コアにはNMIが無く、代わりに、マスクできないTRAPという割り込みが存在する。
TRAPとNMIの違いは、優先順位の割り当てである。
TRAPは、他の割り込みで最も優先順位の高い割り込みと同じ優先順位となるため、NMIのように単独で優先順位が高いわけではない。(下図を参照)

NMI 5.jpg
図. STM8コアの割り込みコントローラの説明(STM8SおよびSTM8Aファミリ)




NMIの使用上の注意

NMIが端子に割り当てられている場合には、ノイズに注意しなければならない。

NMIの端子にノイズが入ると、致命的な障害の発生を誤検知して、マイコンが緊急動作に切り替わってしまう場合がある。
そのため、NMIに割り当てられている端子には、十分なノイズ対策を施す必要がある。

端子から入力されるノイズに関しての対策は、「ハイレベルマイコン講座【EMS対策編】*6)」を参照すること。