• 検索結果がありません。

割り込み処理

ドキュメント内 MDH-J0004 (ページ 43-47)

第 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を返すようにします。

ドキュメント内 MDH-J0004 (ページ 43-47)