Windows版 iTRONサービスコールの作成 (割り込み管理機能)
(その4)
CPUのロックおよびロック解除行うサービスコールは以下のとおりです。
サービスコール名 | 説明 |
---|---|
loc_cpu | CPUをロック状態へ移行します。 |
def_inh | CPUのロック状態を解除します。 |
※ iTRONの仕様とは違い、loc_cpu()ではタスクのディスパッチは禁止しませんので、注意してください。
CPUをロックするには以下のサービスコールを使用します。
ER loc_cpu( void )
引数 | 説明 |
---|---|
なし |
戻り値 | 説明 |
---|---|
E_OK | 正常終了。 |
・サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief CPUロック状態への移行.
*
* @param なし.
*
* @retval エラーコード.
*/
ER loc_cpu( void )
{
ER ercd;
wi_CommonLock();
//! CPUをロックする.
ercd = wi_LockCPU();
wi_CommonUnlock();
return ercd;
}
・CPUロック関数のソースコードは以下のとおりです。
/****************************************************************************/
/*!
* @brief CPUロック状態への移行.
*
* @param なし.
*
* @retval エラーコード.
*/
ER wi_LockCPU( void )
{
//! CPUロックフラグをセットする.
CpuLockFlg = TRUE;
return E_OK;
}
CPUロック関数は以下のような処理を行います。
- CPUのロックフラグをセットして処理を終了します。
CPUのロックを解除するには以下のサービスコールを使用します。
ER unl_cpu( void )
引数 | 説明 |
---|---|
なし |
戻り値 | 説明 |
---|---|
E_OK | 正常終了。 |
・サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief CPUロック状態の解除.
*
* @param なし.
*
* @retval エラーコード.
*/
ER unl_cpu( void )
{
ER ercd;
wi_CommonLock();
//! CPUのロックを解除する.
ercd = wi_UnLockCPU();
wi_CommonUnlock();
return ercd;
}
・CPUアンロック関数のソースコードは以下のとおりです。
/****************************************************************************/
/*!
* @brief CPUロック状態の解除.
*
* @param なし.
*
* @retval エラーコード.
*/
ER wi_UnLockCPU( void )
{
//! CPUロックフラグを解除する.
CpuLockFlg = FALSE;
//! 保留されていた割り込みハンドラの呼び出しを行う.
wi_DelayedIntrrupt();
return E_OK;
}
/****************************************************************************/
/*!
* @brief 保留されていた割り込みハンドラの呼び出しを行う.
*
* @param なし.
*
* @retval なし.
*/
void wi_DelayedIntrrupt( void )
{
WIINTOBJ *p = (WIINTOBJ *)ObjList;
while( p ){
//! 割り込みが保留されていた場合は割り込みを発生させる.
if( p->IntrCnt > 0 ){
wi_IntrruptRequest( p->Hdr.Id );
}
p = (WIINTOBJ *)p->Hdr.Next;
}
}
CPUアンロック関数は以下のような処理を行います。
- CPUのロックフラグをクリアします。
- CPUがロックされている間に割り込みハンドラの呼び出し要求があった場合は、CPUのロックを解除した直後に全ての割り込みハンドラをチェックして保留してある割り込みハンドラの呼び出しを行います。