Windows版iTRONサービスコールの作成 (タスク管理)
(その6)
タスク優先度の設定と参照を行うサービスコールは以下のとおりです。
サービスコール名 | 説明 |
---|---|
chg_pri | タスク優先度を設定します。 |
get_pri | タスク優先度を参照します。 |
※ get_pri()はVer4.0のみサポートされます。
タスク優先度を設定するには以下のサービスコールを使用します。
※ Ver3.0、Ver4.0共に同じサービスコールの形式です。
ER chg_pri( ID tskid, PRI tskpri )
引数 | 説明 |
---|---|
tskid | タスクID番号。 |
tskpri | 設定するタスク優先度。 |
戻り値 | 説明 |
---|---|
E_OK | 正常終了。 |
E_ID | 範囲外のタスクID番号。 |
E_PAR | パラメータエラー。 |
E_OBJ | 指定したタスクID番号は登録済み。 |
・サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief タスク優先度の変更.
*
* @param [in] tskid タスクID番号.
* @param [in] tskpri タスク優先度.
*
* @retval エラーコード.
*/
ER chg_pri( ID tskid, PRI tskpri )
{
ER ercd;
wi_CommonLock();
//! タスクの優先度を変更する.
ercd = wi_ChangeTaskPriority( tskid, tskpri );
wi_CommonUnlock();
return ercd;
}
・タスク優先度を設定する関数のソースコードは以下のとおりです。
/****************************************************************************/
/*!
* @brief タスク優先度の変更.
*
* @param [in] id タスクID番号.
* @param [in] priority タスク優先度.
*
* @retval エラーコード.
*/
ER wi_ChangeTaskPriority( INT id, PRI priority )
{
int curpri,newpri;
ER ercd;
WITSKOBJ *p;
//! タスクIDのオブジェクトを取得する.
p = FindTaskObject( id, &ercd );
if( !p ){
return ercd;
}
if( !p->hThread ){
return E_OBJ;
}
//! 不正なタスク優先度の場合はエラーにする.
if( priority == 0 ){
return E_PAR;
}
p->TaskPri = priority;
//! 現在のスレッドの相対優先順位値を取得する.
curpri = GetThreadPriority( p->hThread );
//! 変更するタスク優先度をスレッドの相対優先順位値に変換する.
newpri = ConvertPriority( priority );
//! スレッドの相対優先順位値が変更される場合、スレッドのプライオリティを変更する.
if( curpri != newpri ){
SetThreadPriority( p->hThread, newpri );
}
return E_OK;
}
タスク優先度を設定する関数は以下のような処理を行います。
- 引数で指定されたタスクID番号に該当するタスク・オブジェクトを取り出します。
- 引数のタスク優先度が 0 の場合はエラー終了にする。
- GetThreadPriority() を呼び出して、現在のスレッドの相対優先順位を取得します。
- 変更するタスク優先度をスレッドの相対優先順位値に変換します。
- SetThreadPriority() を呼び出して、現在のスレッドの相対優先順位を設定します。
スレッドの優先度を取得するのは GetThreadPriority() を呼び出します。
int GetThreadPriority( HANDLE hThread )
引数 | 説明 |
---|---|
hThread | スレッドのハンドル。 |
呼び出しに成功すると指定したスレッドの相対優先順位値が返ります。
呼び出しに失敗すると THREAD_PRIORITY_ERROR_RETURN が返ります。
・タスク優先度をスレッドの相対優先順位値に変換する関数のソースコードは以下のとおりです。
/****************************************************************************/
/*!
* @brief タスク優先度をWindowsスレッドの相対優先順位値に変更する.
*
* @param [in] tskpri タスク優先度.
*
* @retval スレッドの相対優先順位値.
*/
static int ConvertPriority( PRI tskpri )
{
if( tskpri < 10 ){
return THREAD_PRIORITY_ABOVE_NORMAL;
}else
if( tskpri < 50 ){
return THREAD_PRIORITY_NORMAL;
}else
if( tskpri < 100 ){
return THREAD_PRIORITY_BELOW_NORMAL;
}
return THREAD_PRIORITY_LOWEST;
}
※とりあえず4段階にタスク優先度を変換してあります。特に意味はないので、ご自分に都合のよいように直してお使いください。
タスク優先度を参照するには以下のサービスコールを使用します。
ER get_pri( ID tskid, PRI *p_tskpri )
引数 | 説明 |
---|---|
tskid | タスクID番号。 |
p_tskpri | 現在のタスク優先度を格納する領域のポインタ。 |
戻り値 | 説明 |
---|---|
E_OK | 正常終了。 |
E_ID | 範囲外のタスクID番号。 |
E_PAR | パラメータエラー。 |
E_OBJ | 指定したタスクID番号は登録済み。 |
・サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief タスク優先度の参照.
*
* @param [in] tskid タスクID番号.
* @param [out] p_tskpri 現在のタスク優先度を格納する領域のポインタ.
*
* @retval エラーコード.
*/
ER get_pri( ID tskid, PRI *p_tskpri )
{
ER ercd;
wi_CommonLock();
//! タスクの優先度を取得する.
ercd = wi_RefarenceTaskPriority( tskid, p_tskpri );
wi_CommonUnlock();
return ercd;
}
・タスク優先度を参照する関数のソースコードは以下のとおりです。
/****************************************************************************/
/*!
* @brief タスク優先度の参照.
*
* @param [in] id タスクID番号.
* @param [in] priority 現在のタスク優先度を格納する領域のポインタ.
*
* @retval エラーコード.
*/
ER wi_RefarenceTaskPriority( INT id, PRI *priority )
{
ER ercd;
WITSKOBJ *p;
//! タスクIDのオブジェクトを取得する.
p = FindTaskObject( id, &ercd );
if( !p ){
return ercd;
}
//! 引数が不正な場合はエラーにする.
if( !priority ){
return E_PAR;
}
//! タスクの優先度を戻り値にセットする.
*priority = p->TaskPri;
return E_OK;
}
タスク優先度を参照する関数は以下のような処理を行います。
- 引数で指定されたタスクID番号に該当するタスク・オブジェクトを取り出します。
- 引数のタスク優先度を格納する領域のポインタが NULL の場合はエラー終了にする。
- 引数のタスク優先度を格納する領域に現在のタスク優先度をセットして終了します。