●外部割り込みと内部割り込み

Q:割り込みにはマスクできる割り込み(普通の割り込み)と、マスクできない割り込み(NMI)があると聞きました。でも、それとは別の割り込みの分類もあるそうですね。割り込みについて、いろいろ教えてください。

A:確かに、割り込みの分類はたくさんあります。その原因の1つは、割り込みというものがどんどん発展を続けていて、割り込みの定義も拡大してきたことにあります。

ハードウェア

割り込み

外部割り込み

(狭義の割り込み)

タイマ、汎用I/O、通信I/FなどCPU外部からの割り込み

マスカブルとノンマスカブルがある

内部割り込み

(トラップ、例外)

アクセス違反、未定義命令、ゼロ除算などCPU内部の割り込み

ソフトウェア割り込み

(システムコール)

プログラムから命令で呼び出す割り込み

これら全体を例外と呼び、外部割り込みだけを割り込みと呼ぶ場合もある

元々の割り込みというのは、プログラム実行中のコンピュータに、一時的に別のプログラムを実行させて、その後で元のプログラムの続きに戻るという仕組みです。ここで、割り込みが発生する要因を考える必要があります。

図1 外部割り込み

最も代表的なものは、外部信号によって発生する割り込みです。大部分のCPUはINT(マスカブル割り込み)、NMI(ノンマスカブル割り込み)などの割り込み要求入力を備えていて、その入力信号をアクティブにすれば割り込みを発生します。そして、タイマが所定の時間経過を検出したとき、汎用I/Oに所定の入力があったとき、シリアル通信などの通信/インターフェイス機能がデータを受信したときなどに、必要な割り込み要求信号をCPUに入力して割り込みを発生させるようにします。

タイマ、汎用I/O、通信/インターフェイスなどは、CPU本来の機能(主記憶に置かれた命令をフェッチして実行する)とは別物で、CPU外部の機能です。そこで、これらの割り込みを外部割り込みと呼びます。

Q:マイコンの内蔵タイマや汎用入力の割り込みは、マイコン内部で発生するのではないですか。

A:マイコンとか、もっと大規模になるとSoC(システム・オン・チップ)と呼ばれるように1個のLSIにCPU、メモリ、I/Oなどコンピュータシステムの機能を統合したLSIがたくさんありますね。それらの場合、割り込み要因もCPUもともに同じLSIの内部にあるので、『外部』割り込みと言われてもピンと来ないかもしれませんが、CPUから見れば外部にある要因なので外部割り込みに分類します。

Q:では、それらとは別に内部割り込みというものがあるのですか。

A:そうです。CPUが命令をフェッチして実行する過程で、何か問題を生じたときに発生する割り込みを、内部割り込みと呼んでいます。たとえば、命令をフェッチしようとしたアドレスにメモリが実装されていない場合に発生する不正アドレス割り込み、フェッチした命令が未定義のコードだった場合に発生する未定義命令割り込み、0で除算を実行したときに発生するゼロ除算割り込みなどがあります。これらは、CPUから見て内部にある要因です。

これらの内部割り込みは、多くの場合プログラミングのミス、バグなどによって発生します。そして、割り込みが発生せずに実行を続けると、システムが暴走する危険が大きいと言えます。そこで、これらの内部割り込みが発生したら、何らかのエラー処理を行って元のプログラム実行は終了します。その点で、割り込み後に元のプログラムに戻って実行を続ける通常の割り込み(外部割り込み)とは大きな違いがあります。そこで、これらを『割り込み』とは呼ばず、トラップと呼ぶ場合もあります。また、正常動作でないという点から、例外と呼ぶ場合もあります。

この内部割り込み(トラップ)は、プログラム開発時に全体をしっかりデバッグすれば防ぐことができる割り込みです。また、OSをもたないシステムでは、内部割り込みが発生した場合のエラー処理としては、システムをリセットして再スタートするのが普通です。そのため、制御用マイコン(マイクロコントローラ)では、内部割り込みの機能をもたないものも多いです。一方、パソコンやサーバなど、OSが動作している大規模なシステムでは、個々のアプリケーションにバグやエラーがあったとき、システム全体が暴走しては困りますから、OSが内部割り込みを監視して、問題を起こしたアプリケーションを終了させます。内部割り込みは、主にOSのための割り込みと言えるでしょう。

図2 内部割り込み

●ソフトウェア割り込み

Q:外部割り込みと内部割り込みというのがあるのですね。他にも割り込みの種類はありますか。

A:ソフトウェア割り込みがあります。割り込みとは、元々はプログラム実行中に、プログラム側からは分からないタイミングで、ハードウェア的な要因で割り込まれてしまうというものです。ところが、このソフトウェア割り込みは、プログラムの中に特定の呼び出し命令を記述することによって、プログラム側から呼び出す割り込みです。プログラム側から見ると、通常のサブルーチンを呼び出して、サブルーチン終了後に元の場所に戻ってくるのと似ています。

Q:サブルーチン呼び出しと違うところもあるのですか。

A:通常のサブルーチン呼び出しは、呼び出し側のプログラムも呼び出されるサブルーチンも同じ1つのアプリケーションの中にあります。それに対して、ソフトウェア割り込みは、アプリケーションからOSのサービスを呼び出すときに主に使用します。

OS側では、キーボードの読み出しとか、ディスプレイの表示とか、システムに必要ないろいろな基本サービスごとに割り込み処理ルーチンを用意しています。アプリケーション側からは、ソフトウェア割り込みを利用して、好きなときにそれらのサービスを呼び出すことができます。

それで、ソフトウェア割り込みを『割り込み』とは呼ばず、システムコールと呼ぶことも多いです。また、OSを前提としたパソコン用などのマイクロプロセッサにはソフトウェア割り込みが必要ですが、制御用マイコン(マイクロコントローラ)ではソフトウェア割り込みをもたないものが大部分です。

●外部割り込みと省電力機能

Q:OSを使うか使わないかで、必要な割り込みの機能は大きく違うのですね。

A:そうですね。そのために、マイコンの割り込み機能とマイクロプロセッサの割り込み機能にも大きな違いがあります。

代表的な割り込みの種類と機能について説明してきましたが、外部割り込みと省電力機能の関係についても触れておきましょう。最近では、テキサス・インスツルメンツ(TI)のMSP430™ マイコン・シリーズのような省電力マイコンが多くなっています。それらの省電力マイコンでは、特別なスタンバイ命令を実行することによってCPUの動作を停止し、省電力モードに移行します。その省電力モードから、CPU動作モードに戻るのに、外部割り込みを利用しています。通常の割り込みは、何か命令を実行している状態のときに割り込みが発生しますが、省電力からの復帰の場合は、動作を停止している省電力モードのときに割り込みが発生するというのが大きな違いです。

図3 省電力モードと外部割り込み

[関連リンク]

※CapTIvate、MSP430およびMSP432はTexas Instruments Incorporatedの商標です。その他すべての商標および登録商標はそれぞれの所有者に帰属します。

Anonymous