Windows版 iTRONサービスコールの作成 (割り込み管理機能)
(その2)

割り込みハンドラを登録する

割り込みハンドラを登録するサービスコールは以下のとおりです。


サービスコール名説明
def_int

割り込みハンドラを登録します。(Ver3.0のみ)

def_inh

割り込みハンドラを登録します。(Ver4.0のみ)

割り込みハンドラを登録するには以下のサービスコールを使用します。

機能は同じなのですがVer3.0とVer4.0ではサービスコール名が違うので注意してください。


割り込みハンドラを登録する (Ver3.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)

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;
}
	

割り込みハンドラ登録関数は以下のような処理を行います。

  • 既に生成されている割り込みハンドラ番号の場合、既存の割り込みハンドラ・オブジェクト構造体に、新たに登録する割り込みハンドラ・オブジェクト構造体を上書きします。
  • 生成されていない割り込みハンドラ番号の場合、新しい割り込みハンドラ・オブジェクトを生成します。
  • 割り込みハンドラ・リストに生成した割り込みハンドラ・オブジェクトをリンクして処理を終了します。



商標に関する表示