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

CPUをロックまたはロック解除を行う

CPUのロックおよびロック解除行うサービスコールは以下のとおりです。


サービスコール名説明
loc_cpu

CPUをロック状態へ移行します。

def_inh

CPUのロック状態を解除します。

※ iTRONの仕様とは違い、loc_cpu()ではタスクのディスパッチは禁止しませんので、注意してください。

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のロックを解除する

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のロックを解除した直後に全ての割り込みハンドラをチェックして保留してある割り込みハンドラの呼び出しを行います。


商標に関する表示