I/Oドライバを開発時には、I/Oのハードウェアを操作するC言語の関数をいくつか作ることになります。これらの関数名は、"パッケージ名/ドライバ名/デバイス名"に実行するアクションの種別(IosInit/IosExit 等)をつけたものにします。
【例】
パッケージ名:CJI ドライバ名 :IBS 装置機器名 :CPX2B8IO 単一デバイス名:SPL8IB アクション :IosInit(初期化)、IosRead(チャネルのリード)等 この場合、作成する関数名は
cjiibscpx2b8iospl8ibIosRead |
カーネル内部では、まずワークベンチのコンパイラが作ったデータを元に、これらの名前を組み立ます。さらに、名前をもとに関数のアドレスを得ています。
この部分のコードはカスタマイズ可能で、ソースファイル
-
IsaKer\DIOS0CUS.c
初期化
下記の関数はI/O全体の初期化時、各I/Oドライバの初期化前にコールされます。
typSTATUS iosCusInit(
uint16 huNbRtIoDrv, /*In: I/Oドライバの数 */ strKIoXParam* pKIoXParam /*In: 追加のパラメ-タ */ |
終了
下記の関数はI/O全体の終了処理時、各I/Oドライバのexit処理後にコールされます。
void iosCusExit(
uint16 huNbRtIoDrv, /*In: ドライバの数 */ strKIoXParam* pKIoXParam /*In: 追加のパラメ-タ */ |
名前からアドレスを得る
このルーチンは、ワークベンチでデータから得たI/Oドライバの名前から、その関数のアドレスを取得します。
関数名は、"pvRtIoObj"の"psName"フィールドに格納されていて、I/Oオブジェクトの種別に応じてつけられるパッケージ名/ドライバ名/デバイス名を結合したものです。名前の大文字/小文字は未定義です。標準のターゲットでは、小文字で格納されます。
void iosCusFctAddGet(
strKIoXParam* pKIoXParam, /* In: 追加のパラメータ */ uchar cuIoFctType, /* In: アドレスを取得するI/O関数の種別 */ typPFnIplFct* ppfnIplFct1, /* Out: 関数1のアドレス (I/Oオブジェクトに依存) */ typPFnIplFct* ppfnIplFct2 /* Out: 関数2のアドレス (I/Oオブジェクトに依存) */ |
"pvRtIoObj"の実際の型は、"cuIoFctType"パラメータの値によります。
cuIoFctTypeの値 | void* pvRtIoObjの実際の型 | 実体 |
ISA_IO_FCTTYP_DRV | strRtIoDrv* | I/Oドライバ |
ISA_IO_FCTTYP_LEV1DVC | strRtIoCpxDvc* または strRtIoSplDvc* |
レベル1デバイス。I/O装置機器、または単一のI/Oデバイスです。区別するためにはISA_IO_OBJID_GET()関数を使います。 |
ISA_IO_FCTTYP_SPLDVCR | strRtIoSplDvc* | 入力デバイス |
ISA_IO_FCTTYP_SPLDVCW | strRtIoSplDvc* | 出力デバイス |
この関数は実装済みです。
なお、I/Oドライバの名前の生成は次の関数内で行っています。
static uchar _iosObjFctNmBuild(
char* psActionName, /*In: 作成する関数ののアクション名 */ char* psIoObjFctNm, /*Out: 作成した関数名の格納バッファ */ uchar cuIoObjfctNmMLn /*In: バッファの最大長 */ |
アドレスの開放
この関数はI/O関数のアドレスを開放します。ディフォルトの実装のままで機能を実現できます。
void iosCusFctAddRelease(
strKIoXParam* pKIoXParam, /* In: 追加のパラメータ */ uchar cuIoFctType, /* In: 開放する関数の種別 */ typPFnIplFct pfnIplFct1, /* In: 関数1のアドレス (I/Oオブジェクトに依存) */ typPFnIplFct pfnIplFct2 /* In: 関数2のアドレス (I/Oオブジェクトに依存) */ |