Sample 16 割り込み(IRQ)の処理

INtimeアプリケーションで、contec社のディジタルI/Oボード(PIO-32/32)の接点信号入力割り込みを処理する例です。このボードは32点の接点出力と、32点の接点入力を持ちます。接点入力のうち最大4点はハードウェア割り込みの発生要因とすることができます。
例は、接点1つを割り込み信号の発生源となるように初期化して、割り込みが発生したときに32点の接点入力状態をコンソール上にビットパターンで表現するものです。

ダウンロード

filedioint.lzh ...VisualStudio6.0project

filedioint2008.lzh ...VisualStudio2008project

step7.cモジュールの解説

  • main()

    アプリケーションのmain関数です。アプリケーションはここからスタートします。Int1Init()をコールして割り込み処理の準備を行います。その後はプロセスの終了が指示されるまでRtNotifyEvent APIでイベントを待ちます。

util.cモジュールの解説

  • GetPciInterruptLevel

    この関数は対象のPCIボードの検出を行い、検出できた場合はI/OベースアドレスとIRQ番号の割り当てを読み取ります。IRQ番号は所定の計算式によって割り込みレベル値にエンコードする必要があります。割り込みレベル値はデバイスを特定する目的でシステムコールのパラメータに使用されることになります。

int1.cモジュールの解説

  • hex_bit()

    バイナリ値をビットパターンを示す文字列に変換してコンソールに表示する関数です。

  • Int1Handler()

    割り込みハンドラ関数です。デバイスからハードウェア割り込みが発生するとCPUが直接直ちにこの関数をコールします。割り込みハンドラ関数は他のスレッドがいかなる処理をしても割り込む関数ですから、安全のためここで処理できる作業には厳しい制約があって、一部のシステムコールや関数コールしかできませんし、極力短時間で処理を終えなければなりません。
    この例では即座に32点の接点情報を入力(inbyte)します。表示はここで処理できないので割り込みスレッドInt1Thread()を呼び起こして割り込み処理の続きを依頼します。それがSignalrtInterruptThread APIのコールです。また割り込みハンドラの重要な作業として割り込みクリア操作が必要になります。PCIデバイスはこの操作によってソフトウェアに割り込み信号を引き渡せたと認識しますから、この操作を漏らすと割り込みは永久に止まらずにシステムはフリーズ状態になってしまいます。割り込みクリア操作の方法はPCIデバイスによってそれぞれ異なるものなので取扱説明書を慎重に読む必要があります。

  • Int1Thread()

    割り込みスレッドです。割り込み処理をアプリケーションが実装するためには割り込みスレッドの存在がまず必要です。Int1Init()によってこのスレッドは一般スレッドとして起動されますが、SetRtInterruptHandlerをコールして割り込みハンドラ関数をCPUに登録した時点から割り込みスレッドに変わります。そして割り込みスレッドだけが使用可能なAPI WaitForRtInterruptをコールすることでハードウェア割り込みの発生を待ち受ける状態が整います。
    割り込みハンドラ関数ではprintf表示ができないので、割り込みハンドラ関数はSignalRtInterruptThreadをコールします。するとWaitForRtInterruptから処理が復帰されてhex_bit()を実行します。処理が終われば再び割り込み待ちに戻ります。

  • Int1Init()

    割り込み処理を登録する時に使用される関数に仕上がっています。将来割り込みスレッドとなるInt1Thread()をCreateRtThreadして割り込み処理をスタンバイします。このため事前にPCIデバイスの検出とI/Oベースアドレス、割り込みレベル値の取得を行います。さらにデバイスが割り込みを発生できる状態とするために、コントローラに対して割り込み許可の操作(マスク解除)を行います。割り込み許可操作の方法はPCIデバイスによってそれぞれ異なるものなので取扱説明書を慎重に読む必要があります。

  • Int1Kill()

    割り込み処理を抹消するときに使用される関数に仕上がっています。プロセスの終了時にmain()よりコールされます。ここではデバイスが割り込みを発生できないようにする割り込み禁止の操作(マスク)を行います。割り込み禁止操作の方法はPCIデバイスによってそれぞれ異なるものなので取扱説明書を慎重に読む必要があります。
    プロセスの終了時にはデバイスの割り込みを禁止にしておかないと、PCIデバイスは引き続いて割り込み信号を出せる状態にありますから終了時の作業として重要なことです。

関連情報

割り込み処理を作ろう


  最終更新のRSS
Last-modified: Thu, 06 Sep 2012 15:08:23 JST (285d)