Windows版 iTRONサービスコールの作成 (割り込み管理機能)
(その2)
割り込みハンドラを登録するサービスコールは以下のとおりです。
サービスコール名 | 説明 |
---|---|
def_int | 割り込みハンドラを登録します。(Ver3.0のみ) |
def_inh | 割り込みハンドラを登録します。(Ver4.0のみ) |
割り込みハンドラを登録するには以下のサービスコールを使用します。
機能は同じなのですがVer3.0とVer4.0ではサービスコール名が違うので注意してください。
Ver3.0で割り込みハンドラを登録するには以下のサービスコールを使用します。
ER def_int( UINT dintno, const T_DINT *pk_dint )
引数 | 説明 |
---|---|
dintno | 割り込みハンドラ番号。 |
pk_dint | 割り込みハンドラ定義情報構造体のポインタ。 |
戻り値 | 説明 |
---|---|
E_OK | 正常終了。 |
E_ID | 範囲外の割り込みハンドラ番号。 |
E_PAR | パラメータエラー。 |
割り込みハンドラを定義する構造体(T_DINT)は以下のとおりです。
メンバ名 | 説明 |
---|---|
intatr | 割込みハンドラ属性。 |
inthdr | 割込みハンドラのエントリ・アドレス。 |
・サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief 割り込みハンドラの定義.
*
* @param [in] dintno 割り込みハンドラ番号.
* @param [in] pk_dint 割り込みハンドラ定義情報構造体のポインタ.
*
* @retval エラーコード.
*/
ER def_int( UINT dintno, const T_DINT *pk_dint )
{
ER ercd;
WIINTOBJ obj;
//! 引数が不正な場合はエラーにする.
if( !pk_dint ){
return E_PAR;
}
//! 割り込みハンドラ定義情報をコピーする.
memset( &obj, 0, sizeof(WIINTOBJ) );
obj.Attribute = pk_dint->intatr;
obj.IntrAdr = pk_dint->inthdr;
wi_CommonLock();
//! 割り込みハンドラを登録する.
ercd = wi_DefineIntrruptHander( dintno, &obj );
wi_CommonUnlock();
return ercd;
}
Ver4.0で割り込みハンドラを登録するには以下のサービスコールを使用します。
ER def_inh( INTNO intno, const T_DINH *pk_dinh )
引数 | 説明 |
---|---|
intno | 割り込みハンドラ番号。 |
pk_dinh | 割り込みハンドラ定義情報構造体のポインタ。 |
戻り値 | 説明 |
---|---|
E_OK | 正常終了。 |
E_ID | 範囲外の割り込みハンドラ番号。 |
E_PAR | パラメータエラー。 |
割り込みハンドラを定義する構造体(T_DINH)は以下のとおりです。
メンバ名 | 説明 |
---|---|
intatr | 割込みハンドラ属性。 |
inthdr | 割込みハンドラのエントリ・アドレス。 |
・サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief 割り込みハンドラの定義.
*
* @param [in] intno 割り込みハンドラ番号.
* @param [in] pk_dinh 割り込みハンドラ定義情報構造体のポインタ.
*
* @retval エラーコード.
*/
ER def_inh( INTNO intno, const T_DINH *pk_dinh )
{
ER ercd;
WIINTOBJ obj;
//! 引数が不正な場合はエラーにする.
if( !pk_dinh ){
return E_PAR;
}
//! 割り込みハンドラ定義情報をコピーする.
memset( &obj, 0, sizeof(WIINTOBJ) );
obj.Attribute = pk_dinh->inhatr;
obj.IntrAdr = pk_dinh->inthdr;
wi_CommonLock();
//! 割り込みハンドラを登録する.
ercd = wi_DefineIntrruptHander( intno, &obj );
wi_CommonUnlock();
return ercd;
}
割り込みハンドラ登録関数
割り込みハンドラ登録関数のソースコードは以下のとおりです。
/****************************************************************************/
/*!
* @brief 割り込みハンドラの定義.
*
* @param [in] no 割り込みハンドラ番号.
* @param [in] obj 割り込みハンドラ.オブジェクト構造体のポインタ.
*
* @retval エラーコード.
*/
ER wi_DefineIntrruptHander( INT no, const WIINTOBJ *obj )
{
ER ercd;
WIINTOBJ *p;
//! 既に生成しているハンドラ番号の場合はエントリアドレスを更新する.
p = (WIINTOBJ *)wi_GetObject( no, ObjList );
if( p ){
p->IntrAdr = obj->IntrAdr;
p->Enabled = FALSE;
p->IntrCnt = 0;
return E_OK;
}
//! 割り込みハンドラ・オブジェクトを作成する.
p = (WIINTOBJ *)wi_CreateObject( no, TMAX_MAXINT, sizeof(WIINTOBJ), obj, ObjList, &ercd );
if( !p ){
return ercd;
}
//! リストに割り込みハンドラを追加する.
wi_AddObject( (WIHDR *)p, &ObjList );
return E_OK;
}
割り込みハンドラ登録関数は以下のような処理を行います。
- 既に生成されている割り込みハンドラ番号の場合、既存の割り込みハンドラ・オブジェクト構造体に、新たに登録する割り込みハンドラ・オブジェクト構造体を上書きします。
- 生成されていない割り込みハンドラ番号の場合、新しい割り込みハンドラ・オブジェクトを生成します。
- 割り込みハンドラ・リストに生成した割り込みハンドラ・オブジェクトをリンクして処理を終了します。