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;
}
割り込み許可関数は以下のような処理を行います。
- 引数で指定された割り込みハンドラ番号に該当する割り込み・オブジェクトを取り出します。
- 割り込みハンドラ情報の割り込み禁止フラグをクリアします。
- 割り込みが禁止されている間に割り込みハンドラの呼び出し要求があった場合は、割り込みを許可した直後に割り込みハンドラを呼び出します。