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番号に該当するタスク・オブジェクトを取り出します。
- 該当タスクがイベントの発生待ちをしていない場合はエラーにします。
- 待ち状態の強制解除フラグをセットしてタスクを起床させます。