Windows版iTRONサービスコールの作成 (タスク管理)
(その10)

タスクの待ち状態を強制解除する

タスクの待ち状態を強制解除するサービスコールは以下のとおりです。


サービスコール名説明
rel_wai

タスクの待ち状態を強制解除します。

irel_wai

タスクの待ち状態を強制解除します。(非タスクコンテキストからの呼出し)

※ irel_wai()はVer4.0のみサポートされます。

タスクの待ち状態を強制解除する

タスクの待ち状態を強制解除するには以下のサービスコールを使用します。

※ Ver3.0、Ver4.0共に同じサービスコールの形式です。



    ER rel_wai( ID tskid )
	

引数説明
tskid

タスクID番号。

戻り値説明
E_OK

正常終了。

E_ID

範囲外のタスクID番号。

E_NOEXS

指定したタスクID番号のタスクが未登録。

E_OBJ

タスクが待ち状態でない。



 

Ver4.0では割り込みハンドラや周期起動ハンドラ等の非タスク処理内からの呼び出しは、rel_wai()ではなく、irel_wai()を使用します。


    ER irel_wai( ID semid )
	

引数および戻り値は rel_wai() と同じです。


・rel_wai() サービスコールのソースコードは以下のようになります。


/****************************************************************************/
/*!
 *  @brief  待ち状態の強制解除.
 *
 *  @param  [in]    tskid   タスクID番号.
 *
 *  @retval エラーコード.
 */
ER      rel_wai( ID tskid )
{
    ER ercd;

    wi_CommonLock();

    //! タスクの待ち状態を強制的に解除する.
    ercd = wi_ReleaseWait( tskid );

    wi_CommonUnlock();
    return ercd;
}
	

タスクID番号を引数にしてタスクの待ち状態を強制解除する関数を呼び出します。


・irel_wai() サービスコールのソースコードは以下のようになります。


/****************************************************************************/
/*!
 *  @brief  待ち状態の強制解除 (非タスクコンテキストからの呼出し用).
 *
 *  @param  [in]    tskid   タスクID番号.
 *
 *  @retval エラーコード.
 */
ER      irel_wai( ID tskid )
{
    return rel_wai( tskid );
}
	

rel_wai()を改めて呼び出すだけですので、rel_wai()と同じ動作になります。

タスクの待ち状態を強制解除する関数

タスクの待ち状態を強制解除する関数のソースコードは以下のとおりです。



/****************************************************************************/
/*!
 *  @brief  待ち状態の強制解除.
 *
 *  @param  [in]    id      タスクID番号.
 *
 *  @retval エラーコード.
 */
ER      wi_ReleaseWait( INT id )
{
    ER          ercd;
    WITSKOBJ    *p;

    //! 自タスクが指定された場合はエラーにする.
    if( id == TSK_SELF ){
        return E_OBJ;
    }
    //! タスクIDのオブジェクトを取得する.
    p = FindTaskObject( id, &ercd );
    if( !p ){
        return ercd;
    }
    if( !p->hThread ){
        return E_OBJ;
    }
    //! イベント待ちをしていない場合はエラーにする.
    if( p->EventType == 0 ){
        return E_OBJ;
    }
    //! 待ち状態の強制解除フラグをセットしてイベントを発行する.
    p->RelRes = TRUE;
    if( !SetEvent( p->hEvent ) ){
        return E_SYS;
    }
    return E_OK;
}
	

タスクの待ち状態を強制解除する関数は以下のような処理を行います。

  • 引数で指定されたタスクID番号が自タスクの場合はエラーにします。
  • 引数で指定されたタスクID番号に該当するタスク・オブジェクトを取り出します。
  • 該当タスクがイベントの発生待ちをしていない場合はエラーにします。
  • 待ち状態の強制解除フラグをセットしてタスクを起床させます。


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