Windows版iTRONサービスコールの作成 (タスク管理)
(その3)
タスクを削除するサービスコールは以下のとおりです。
サービスコール名 | 説明 |
---|---|
del_tsk | タスク・オブジェクトをシステムから削除します。 |
※ Ver3.0、Ver4.0共に同じサービスコールの形式です。
タスクを削除するには以下のサービスコールを使用します。
ER del_tsk( ID tskid )
引数 | 説明 |
---|---|
tskid | タスクID番号。 |
戻り値 | 説明 |
---|---|
E_OK | 正常終了。 |
E_ID | 範囲外のタスクID番号。 |
E_NOEXS | 指定したタスクID番号のタスクが未登録。 |
E_OBJ | タスクの状態が「休止中」以外。 |
・サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief タスクの削除.
*
* @param [in] tskid タスクID番号.
*
* @retval エラーコード.
*/
ER del_tsk( ID tskid )
{
ER ercd;
wi_CommonLock();
//! タスクを削除する.
ercd = wi_DeleteTask( tskid );
wi_CommonUnlock();
return ercd;
}
削除するタスクのID番号を引数としてタスク削除関数を呼び出します。
タスク削除関数
タスクの削除を行う関数のソースコードは以下のとおりです。
/****************************************************************************/
/*!
* @brief タスクの削除.
*
* @param [in] id タスクID番号.
*
* @retval エラーコード.
*/
ER wi_DeleteTask( INT id )
{
WITSKOBJ *p = (WITSKOBJ *)ObjList;
WIHDR **b_ptr = &ObjList;
//! 自タスクは削除できない.
if( id == TSK_SELF ){
return E_OBJ;
}
//! 不正なタスクIDの場合はエラーにする.
if( id >= TMAX_MAXTSK ){
return E_ID;
}
while( p ){
//! 指定されたIDと一致するタスクを見つけた場合、タスクをクローズする.
if( p->Hdr.Id == id ){
//! スレッドが休止状態でない場合は削除しない.
if( p->TaskState != TTS_DMT ){
return E_OBJ;
}
//! リストから該当するタスクを取り除く.
*b_ptr = (WIHDR *)(p->Hdr.Next);
if( p->hThread ){
//! スレッドが停止していることを確認する.
wi_DormantThread( p->hThread, 10 );
//! スレッド・ハンドルを解放する.
CloseHandle( p->hThread );
p->hThread = NULL;
}
//! イベント・ハンドルを解放する.
if( p->hEvent ){
CloseHandle( p->hEvent );
p->hEvent = NULL;
}
//! 待ち行列からタスクを削除する.
wi_AllReleaseSemaphore( id );
wi_AllReleaseEvFlag( id );
wi_AllReleaseMailBox( id );
wi_AllReleaseDataQueue( id );
wi_AllReleaseMutex( id );
wi_AllReleaseMsgBuffer( id );
wi_AllReleaseRendPort( id );
//! メモリプールから獲得したメモリブロックを返却する.
wi_AllReleaseFixedMemPool( id );
wi_AllReleaseVarMemPool( id );
//! タスク構造体を解放する.
SAFE_RELEASE( p );
return E_OK;
}
//! リストから次のタスクを取り出す.
b_ptr = &(p->Hdr.Next);
p = (WITSKOBJ *)(p->Hdr.Next);
}
return E_NOEXS;
}
タスクの削除を行う関数は以下のような処理を行います。
- 削除するタスクID番号が1~TMAX_MAXTSK の範囲内かどうかをチェックします。
- タスク・オブジェクトのリストを先頭から検索して、削除するタスクID番号と一致するタスク・オブジェクトのポインタを取り出します。
- 削除するタスクが『休止中』以外の場合、タスクの削除は行わずに処理を終了します。
- タスク・オブジェクトのリストから削除するオブジェクトを外します。
- スレッドを生成している場合、スレッドの停止を確認してスレッド・ハンドルを解放します。
- イベント・ハンドルを解放します。
- 同期オブジェクトの待ち行列から削除するタスクを外します。
- メモリプールから獲得したメモリブロックを全て返却します。
- タスク・オブジェクトのために確保したメモリを解放して処理を終了します。