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()関数を使用しないでイベント待ちを利用します。