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

割り込みを禁止または許可する

割り込みの禁止および許可を行うサービスコールは以下のとおりです。


サービスコール名説明
dis_int

割り込みを禁止します。

def_inh

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

割り込みを禁止する

割り込みを禁止するには以下のサービスコールを使用します。


・Ver3.0のサービスコール


    ER dis_int( UINT eintno )
	

・Ver4.0のサービスコール


    ER dis_int( INTNO intno )
	

引数説明
eintno / intno

割り込みハンドラ番号。

戻り値説明
E_OK

正常終了。

E_ID

範囲外の割り込みハンドラ番号。

E_NOEXS

指定した割り込みハンドラ番号は登録されていない。


・Ver3.0のサービスコールのソースコードは以下のようになります。


/****************************************************************************/
/*!
 *  @brief  割り込みの禁止.
 *
 *  @param  [in]    eintno      割り込みハンドラ番号.
 *
 *  @retval エラーコード.
 */
ER      dis_int( UINT eintno )
{
    ER ercd;

    wi_CommonLock();

    //! 割り込みを禁止する.
    ercd = wi_DisableIntrrupt( eintno );

    wi_CommonUnlock();
    return ercd;
}
	


・Ver4.0のサービスコールのソースコードは以下のようになります。


/****************************************************************************/
/*!
 *  @brief  割り込みの禁止.
 *
 *  @param  [in]    intno       割り込みハンドラ番号.
 *
 *  @retval エラーコード.
 */
ER      dis_int( INTNO intno )
{
    ER ercd;

    wi_CommonLock();

    //! 割り込みを禁止する.
    ercd = wi_DisableIntrrupt( intno );

    wi_CommonUnlock();
    return ercd;
}
	

※ Ver3.0とVer4.0では引数の割り込みハンドラ番号のデータ型が違うだけで処理は同じです。

割り込み禁止関数

割り込み禁止関数のソースコードは以下のとおりです。



/****************************************************************************/
/*!
 *  @brief  割り込みの禁止.
 *
 *  @param  [in]    no      割り込みハンドラ番号.
 *
 *  @retval エラーコード.
 */
ER      wi_DisableIntrrupt( INT no )
{
    ER          ercd;
    WIINTOBJ    *p;

    //! ハンドラ番号のオブジェクトを取得する.
    p = (WIINTOBJ *)wi_FindObject( no, TMAX_MAXINT, ObjList, &ercd );
    if( !p ){
        return ercd;
    }
    //! 割り込みを禁止する.
    p->Enabled = FALSE;
    return E_OK;
}
	

割り込み禁止関数は以下のような処理を行います。

  • 引数で指定された割り込みハンドラ番号に該当する割り込み・オブジェクトを取り出します。
  • 割り込みハンドラ情報の割り込み禁止フラグをセットして処理を終了します。

割り込みを許可する

割り込みを許可するには以下のサービスコールを使用します。


・Ver3.0のサービスコール


    ER ena_int( UINT eintno )
	

・Ver4.0のサービスコール


    ER ena_int( INTNO intno )
	

引数説明
eintno / intno

割り込みハンドラ番号。

戻り値説明
E_OK

正常終了。

E_ID

範囲外の割り込みハンドラ番号。

E_NOEXS

指定した割り込みハンドラ番号は登録されていない。


・Ver3.0のサービスコールのソースコードは以下のようになります。


/****************************************************************************/
/*!
 *  @brief  割り込みの許可.
 *
 *  @param  [in]    eintno      割り込みハンドラ番号.
 *
 *  @retval エラーコード.
 */
ER      ena_int( UINT eintno )
{
    ER ercd;

    wi_CommonLock();

    //! 割り込みを許可する.
    ercd = wi_EnableIntrrupt( eintno );

    wi_CommonUnlock();
    return ercd;
}
	


・Ver4.0のサービスコールのソースコードは以下のようになります。


/****************************************************************************/
/*!
 *  @brief  割り込みの許可.
 *
 *  @param  [in]    intno       割り込みハンドラ番号.
 *
 *  @retval エラーコード.
 */
ER      ena_int( INTNO intno )
{
    ER ercd;

    wi_CommonLock();

    //! 割り込みを許可する.
    ercd = wi_EnableIntrrupt( intno );

    wi_CommonUnlock();
    return ercd;
}
	

※ Ver3.0とVer4.0では引数の割り込みハンドラ番号のデータ型が違うだけで処理は同じです。

割り込み許可関数

割り込み許可関数のソースコードは以下のとおりです。



/****************************************************************************/
/*!
 *  @brief  割り込みの許可.
 *
 *  @param  [in]    no      割り込みハンドラ番号.
 *
 *  @retval エラーコード.
 */
ER      wi_EnableIntrrupt( INT no )
{
    ER          ercd;
    WIINTOBJ    *p;

    //! ハンドラ番号のオブジェクトを取得する.
    p = (WIINTOBJ *)wi_FindObject( no, TMAX_MAXINT, ObjList, &ercd );
    if( !p ){
        return ercd;
    }
    //! 割り込みを許可する.
    p->Enabled = TRUE;

    //! 割り込みが保留されていた場合は割り込みを発生させる.
    if( p->IntrCnt > 0 ){
        wi_IntrruptRequest( no );
    }
    return E_OK;
}
	

割り込み許可関数は以下のような処理を行います。

  • 引数で指定された割り込みハンドラ番号に該当する割り込み・オブジェクトを取り出します。
  • 割り込みハンドラ情報の割り込み禁止フラグをクリアします。
  • 割り込みが禁止されている間に割り込みハンドラの呼び出し要求があった場合は、割り込みを許可した直後に割り込みハンドラを呼び出します。



Windowsは米国Microsoft Corporationの登録商標です。