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

タスクのディレイ

タスクを遅延(ディレイ)させるサービスコールは以下のとおりです。


サービスコール名説明
dly_tsk

タスクの実行を遅延させる。

タスクの実行を遅延させる

タスクの実行を遅延させるには以下のサービスコールを使用します。

※ Ver3.0とVer4.0では引数のデータ型が異なりますので注意してください。

・Ver3.0の場合


    ER dly_tsk( DLYTIME dlytim )
	

・Ver4.0の場合


    ER dly_tsk( RELTIM dlytim )
	

引数説明
dlytim

遅延時間。

戻り値説明
E_OK

正常終了。

E_PAR

引数 dlytim が不正な値。

E_CTX

非タスクコンテキストからの呼び出し。


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


/****************************************************************************/
/*!
 *  @brief  自タスクの遅延.
 *
 *  @param  [in]    dlytim  遅延時間.
 *
 *  @retval エラーコード.
 */
ER      dly_tsk( DLYTIME dlytim )
{
    ER  ercd;

    wi_CommonLock();

    ercd = wi_DelayTask( (TMO)dlytim );

    wi_CommonUnlock();
    return ercd;
}
	

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


/****************************************************************************/
/*!
 *  @brief  自タスクの遅延.
 *
 *  @param  [in]    dlytim  遅延時間.
 *
 *  @retval エラーコード.
 */
ER      dly_tsk( RELTIM dlytim )
{
    ER  ercd;

    wi_CommonLock();

    ercd = wi_DelayTask( (TMO)(dlytim.ltime) );

    wi_CommonUnlock();
    return ercd;
}
	

タスクのディレイ関数を呼び出します。

Ver4.0では、遅延時間が構造体になっているので、下位32ビットを取り出して遅延時間としてます。

タスクのディレイ関数

タスクのディレイ関数のソースコードは以下のとおりです。



/****************************************************************************/
/*!
 *  @brief  自タスクの遅延.
 *
 *  @param  [in]    dlytim  遅延時間.
 *
 *  @retval エラーコード.
 */
ER      wi_DelayTask( TMO dlytim )
{
    ER          ercd;
    WITSKOBJ    *p;

    //! 引数が不正な場合はエラーにする.
    if( dlytim == TMO_FEVR ){
        return E_PAR;
    }
    //! 自タスクのタスク・オブジェクトを取得する.
    p = FindTaskObject( TSK_SELF, &ercd );
    if( !p || !p->hThread ){
        return E_CTX;
    }
    //! イベント待ちでタイムアウトをさせる.
    ercd = wi_TaskWait( p->Hdr.Id, TTW_DLY, dlytim, 0, NULL );
    if( ercd == E_TMOUT ){
        ercd  = E_OK;
    }
    return ercd;
}
	

タスクのディレイ関数は以下のような処理を行います。

  • 遅延時間が TMO_FEVR の場合、タイムアウトできないのでエラーにします。
  • 自タスクのタスク・オブジェクトを取り出します。
  • 非タスクコンテキストからの呼び出しの場合、タスク・オブジェクトが取り出せないのでエラー終了にします。
  • イベント待ちのタイムアウトを利用してタスクをスリープさせます。
  • イベント待ちから復帰したときの戻り値が『E_TMOUT(タイムアウト)』の場合、『E_OK(正常終了)』に変換して終了します。

dly_tsk()は、待ち状態の強制解除(rel_wai)によってスリープが中断されることがありますので、Sleep()関数を使用しないでイベント待ちを利用します。



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