第 3 章 インタフェースモジュール制御 9
3.5 割り込み設定・制御
3.5.3 割り込み処理
DOS System開発らくらくパッケージの総合ライブラリを使用することで、割り込み処
理を簡単に行うことができます。
■概要
総合ライブラリを使用することで、アプリケーションから、割り込みを使用するための割り込み 処理関数の登録, 削除を簡単に行うことができます。
総合ライブラリのAPI関数をプログラム上から使用する場合は「include」ディレクトリ内の
「IFDOS.H」を使用し、「lib」ディレクトリ内からご使用のコンパイラ, メモリモデルに合った総
合ライブラリをリンクして使用してください。
総合ライブラリでは、まずPciSetInterrupt関数で割り込み処理の登録ができます。その際、割り込み ベクタの設定や、割り込みコントローラへの設定は不要です。この関数では、最高で16個の割り込 み処理を登録できます。
次にPciKillInterrupt関数で、登録した割り込みの解除ができます。この時も割り込みベクタや割り込 みコントローラへの設定は不要です。
また、実際に割り込みが発生した場合に、EOIを発行したり、自インタフェースモジュールへの割 り込みでない時に、別のデバイスの処理にチェインすることも代行しますので、その処理を別途作 成する必要はありません。
■割り込みライブラリ関数一覧
No. 関数名 機 能
1 PciSetInterrupt 割り込み処理関数を登録します。
2 PciKillInterrupt 割り込み処理関数を削除します。
3 ユーザ割り込み 処理関数
PciSetInterrupt関数にて登録するお客様が定義する割り込み処理関数で す。本ユーザ割り込み処理関数は、インタフェースモジュールから該 当IRQの割り込みが発生した時にライブラリ側から呼び出されます。
■割り込みライブラリ関数個別説明
1. PciSetInterrupt
【機能】
割り込み処理関数を登録します。
【書式】
#include "IFDOS.h"
int IFCDECL far PciSetInterrupt ( unsigned char Irq,
int far (far *Func)(int, short, long),
short user1,
long user2
);
【パラメータ】
Irq IRQ番号を設定してください。
(far *Func) (int, short, long)
呼び出されるユーザ割り込み処理関数へのfarポインタを指定します。
ユーザ割り込み処理関数へは、ハンドル, ユーザ変数(short型とlong型)が 渡されます。ユーザ割り込み処理関数を参照してください。
user1 ユーザ割り込み処理関数に渡される、ユーザで自由に設定できるshort型
の変数です。
user2 ユーザ割り込み処理関数に渡される、ユーザで自由に設定できるlong型の 変数です。
【戻り値】
処理が正常に終了すると、ハンドルを返します。
このハンドルは、ユーザ割り込み処理関数を一意に認識するため0~15の範囲の値です。
正常に処理が行えなかった場合、-1を返します。
DOS System(日本語環境モデル)で実行していない場合、-9を返します。
2. PciKillInterrupt
【機能】
割り込み処理関数を削除します。
【書式】
#include "IFDOS.h"
int IFCDECL far PciKillInterrupt (
short handle
);
【パラメータ】
handle PciSetInterrupt関数で取得したハンドルを指定してください。
【戻り値】
処理が正常に終了すると、0の値を返します。
正常に処理が行えなかった場合、-1の値を返します。
DOS System(日本語環境モデル)で実行していない場合、-9を返します。
3. ユーザ割り込み処理関数
【機能】
PciSetInterrupt関数にて登録するお客様が定義する割り込み処理関数です。
本ユーザ割り込み処理関数は、インタフェースモジュールから該当IRQの割り込みが発生した 時にライブラリ側から呼び出されます。
【書式】
#include "IFDOS.h"
int IFCDECL far user_func (
int handle,
short user1,
long user2
);
【パラメータ】
handle ユーザ割り込み処理関数を一意に識別するハンドルです。PciSetInterrupt 関数にて返されるハンドルと同一値です。このハンドルの値をチェック することにより、1つのユーザ割り込み処理関数を複数のIRQにて共有す る時にどのIRQから発生した割り込みであるかを判定することができま す。
user1 PciSetInterrupt関数のUser1パラメータに指定された値です。
user2 PciSetInterrupt関数のUser2パラメータに指定された値です。
【戻り値】
ユーザ割り込み処理関数にて、割り込み処理を実行した場合には1を返すようにしてください。
該当インタフェースモジュール以外の他デバイスからの割り込みであった場合には0を返すよ うにしてください。
【記述例】
int far user_func(int handle, short user1, long user2){
unsigned char stat;
unsigned short port;
port = user1;
stat = inp(port + 0x02); /*割り込みステータスの確認 */
if (stat & 0x10) { /*該当インタフェースモジュールからの割り込み確認*/
timer++;
return 1; /*割り込み処理の正常終了1をリターン */
}
return 0; /*他のデバイスのため、0をリターン */
}
【備考】
・Microsoft系コンパイラの場合には、/Gs(スタックチェック禁止)オプションを付加してコンパ
イルしてください。
・ユーザ割り込み処理関数内では、必ずインタフェースモジュールの割り込みステータスの確 認を行い、該当インタフェースモジュールからの割り込みであるか否かのチェックを行うよ うにしてください。その結果、該当インタフェースモジュールからの割り込みであれば、必 要な割り込み処理を実行後、1を返すようにします。