江島 午郎 杉本 拓也 松井 俊訓 江島 午郎(えじま ごろう/左)
コードギア株式会社代表
杉本 拓也(すぎもと たくや/中)
松井 俊訓(まつい としのり/右)
株式会社富士通ソフトウェアテクノロジーズ


 「割り込み」とは、プログラムで制御しているハードウェアから、実行中のプロセスに対して処理を要求する仕組みです。

 たとえば、プリンタで印刷している途中でミスに気づき、中断しようとストップキーを押したとき、プリンタからプロセスに対して割り込みが発生します。割り込みを受け取ったプロセス側では、その時点で実行中の処理を中断して、割り込みに応じた処理(この場合は印刷を中断する処理)を行います。

 割り込みが発生してから印刷が中断されるまでに何十秒もかかると、その分だけミスのある印刷物が無駄に出力されてしまうので、割り込みはできるだけ早く処理しなければなりません。1枚の用紙を印字する時間が秒単位だとすると、1~2秒以内には印刷が中断されるように処理する必要があります。逆に言うと、1~2秒なら許容できる範囲であり、通常はマイクロ秒のようにごく短い単位の処理は不要です。

 これが自動車のエアバッグだったらどうでしょう。衝撃が起きてからエアバッグが膨らみ始めるまでに何秒間もかかっていたら、人命に関わります。プリンタの紙とは比べ物になりません。ですからこういったライフクリティカルなデバイスでは、ミリ秒よりもっと小さいマイクロ秒やナノ秒といったごく短い時間で割り込みを処理する必要があります。

 組み込みデバイスでは様々な割り込みが発生します。それを組み込みOSがどう処理するかは、リアルタイム性に関わる大きな問題です。そのため、割り込み処理にはいろいろな工夫がなされています。今回は、Windows Embedded CE 6.0の割り込み処理の大きな特長であるISRとIST、およびInterrupt IDについて解説します。

ISRとISTの2段階で行う割り込み処理

 Windows Embedded CE 6.0 の割り込み処理機構は、割り込みハンドラの応答性能の向上と、割り込み処理の実装の容易さを両立させるモデルとして設計されています。その特徴は、ISR(Interrupt Service Routine:割り込み処理ルーチン)とIST(Interrupt Service Thread:割り込み処理スレッド)の2 ステップによって割り込み処理を行うこと、そして割り込みをInterrupt ID(システム割り込み番号。SYSINTRとも呼ぶ)という論理的な番号で管理していることです。

 まず、割り込みが発生してから処理が行われるまでのシーケンスを見てみましょう(図1)。

図1●割り込み発生から割り込み処理までのシーケンス
図1●割り込み発生から割り込み処理までのシーケンス

(1) ハードウェアからの割り込みが発生すると、実行中の処理が中断され、割り込みを処理する例外ハンドラが呼び出されます。割り込みがどのデバイスから発生したかは、IRQ(Interrupt Request:割り込み要求)という識別番号で表わされます。

(2) 例外ハンドラは、IRQに対応するISR(割り込み処理ルーチン)を呼び出します。

(3) ISRでは割り込みの発生元のハードウェアを判定し、戻り値として、IRQに対応するInterrupt IDをカーネルに返します。Interrupt IDとは、IRQをソフトウェアにマッピングしたもの、つまりハードウェア割り込みをソフトウェアの番号に置き換えたものです。OS内では、割り込みはすべてInterrupt IDで管理されます。この番号がそれぞれイベントオブジェクトと対応しています。Interrupt IDの実装は、ヘッダファイル中に「SYSINTR_xxx」という文字列で定義された定数です。このヘッダファイルは、Windows Embedded CE 6.0 の[WINCE600]フォルダ配下に格納されています。

(4) Interrupt IDを返されたカーネルは、IST(割り込み処理スレッド)のイベントオブジェクトにシグナルを送ります。ISTとは、デバイスドライバ内の割り込み専用スレッドで、優先度が他のスレッドより高く設定されています。デバイスに対して割り込み処理を行うのは、このスレッドです。

(5) デバイスドライバ内でブロック状態になっていたISTのイベントオブジェクトがシグナル状態になると、デバイスに対して割り込み処理を実行します。

(6) ISTで割り込み処理が完了すると、カーネルに完了が通知されます。

割り込みを制するものがリアルタイムを制す

 ここで注意することは、ISRの実行中はOSが割り込み禁止状態になることです。そのため、ISR内で時間を要する処理を行うと、次の割り込みが遅延してしまいます。したがって、通常ISRでは、割り込みを判定してInterrupt IDを返すこと以外の処理はなるべく行わないようにして、実際の割り込み処理は優先順位の高いISTで行います。

 この場合でも、Windows Embedded CE 6.0では優先度の高い割り込みは処理されます。それは「ISRネスト機構」を備えているからです。ISRネスト機構とは、ISR内で処理をしている途中でさらに優先度の高い割り込みが発生した場合、それを処理できる機能のことです。これによって、優先度の高い割り込みの遅延を防ぐことができます。

 ただし、ときにはISRの処理からISTで割り込みイベントを受信するまでの、わずか数~数十マイクロ秒の遅延時間が問題となるようなケースもあります。たとえば高ビットレートの通信に伴う割り込み処理では、この遅延がFIFOのオーバーフローあるいはアンダーフローを引き起こす可能性があります。そのようなケースでは、FIFO処理などタイムクリティカルな処理を例外的にISR に移植することが有効な対策になることもあります。

 このようにWindows Embedded CE 6.0では、2段階で割り込みを処理するという工夫によって、割り込みの性質に応じたリアルタイム性を確保しています。

修正するたびにビルドしなくてもよいInstallable ISR

 通常、ISRはOALに実装します。OAL(OEM Adaptation LayerまたはOEM Abstraction Layer)とは、ハードウェアとカーネルの間に位置してハードウェアの違いを吸収するレイヤーのことで、他のOSで言うとHALに相当します。

 したがって、OAL内のISRを修正した場合はOSイメージを再ビルドしなくてはいけません。しかし、ターゲットとして接続するデバイスによって割り込みのルーティングを変更しなければならない場合や、割り込みを複数のデバイスで共有しなければならない場合などは、そのたびにOSイメージを再ビルドすることはできません。そのようなときに使うのが、Installable ISR(インストール可能ISR)です。

 Installable ISRの実装は、デバイスドライバの初期化時にロードされるDLLです。DLLですから、実行時に必要に応じて呼び出せます。OAL内のISRでは、ロードされたInstallable ISR のルーティング処理を、NKCallIntChainという関数によって行います。その様子を図2に示します。

タイトル
図2●Installable ISRはNKCallIntChainによって切り替える

 Windows Embedded CE 6.0の割り込み処理は、このように実装の容易さの点でも工夫されています。