Windows版iTRONサービスコールの作成 (タスク管理)
(その7)
タスクの状態を参照するサービスコールは以下のとおりです。
サービスコール名 | 説明 |
---|---|
ref_tsk | タスクの状態を取得します。 |
ref_tst | タスクの状態を取得します。 (簡易版) |
※ Ver3.0と4.0では関数名は同じですが、引数の順番が逆になりますので注意してください。
※ ref_tst() は4.0のみサポートされます。
Ver3.0でタスクの状態を取得するには以下のサービスコールを使用します。
ER ref_tsk( T_RTSK *pk_rtsk, ID tskid )
引数 | 説明 |
---|---|
pk_rtsk | タスク状態を格納する構造体のポインタ。 |
tskid | タスクID番号。 |
戻り値 | 説明 |
---|---|
E_OK | 正常終了。 |
E_ID | 範囲外のタスクID番号。 |
E_NOEXS | 指定したタスクID番号は登録されていない。 |
E_PAR | パラメータエラー。 |
タスク状態を格納する構造体(T_RTSK)は以下のとおりです。
メンバ名 | 説明 |
---|---|
exinf | 拡張情報。 |
tskpri | 現在の優先度。 |
tskstat | タスク状態。 |
tskwait | 待ち要因。 |
wid | 待ちオブジェクトID。 |
wupcnt | 起床要求カウント。 |
suscnt | サスペンド要求カウント。 |
tskatr | タスク属性。 |
task | タスクの起動アドレス。 |
itskpri | タスク起動時優先度。 |
stksz | スタックサイズ。 |
・サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief タスクの状態参照.
*
* @param [in] pk_rtsk タスク状態を格納する領域のポインタ.
* @param [in] tskid タスクID番号.
*
* @retval エラーコード.
*/
ER ref_tsk( T_RTSK *pk_rtsk, ID tskid )
{
ER ercd;
WITSKSTAT sts;
//! 引数が不正な場合はエラーにする.
if( !pk_rtsk ){
return E_PAR;
}
wi_CommonLock();
//! 取得したタスクの状態を戻り値として構造体にセットする.
ercd = wi_RefarenceTask( tskid, &sts );
if( ercd == E_OK ){
pk_rtsk->exinf = sts.ExtInfo;
pk_rtsk->tskpri = sts.TaskPri;
pk_rtsk->tskstat = sts.TaskState;
pk_rtsk->tskwait = sts.EventType;
pk_rtsk->wid = sts.WaitId;
pk_rtsk->wupcnt = sts.WakeupCnt;
pk_rtsk->suscnt = sts.SuspendCnt;
pk_rtsk->tskatr = sts.TaskAtr;
pk_rtsk->task = sts.TaskAdr;
pk_rtsk->itskpri = sts.InitPri;
pk_rtsk->stksz = sts.StackSize;
}
wi_CommonUnlock();
return ercd;
}
タスク状態を格納する構造体のポインタがNULLの場合エラーにします。
タスク状態を取得する関数を呼び出して現在のタスクの状態を取得し引数の構造体に格納します。
タスクの状態を取得する (Ver4.0)
Ver4.0でタスクの状態を取得するには以下のサービスコールを使用します。
ER ref_tsk( ID tskid, T_RTSK *pk_rtsk )
引数 | 説明 |
---|---|
semid | タスクID番号。 |
pk_rtsk | タスク状態を格納する構造体のポインタ。 |
戻り値 | 説明 |
---|---|
E_OK | 正常終了。 |
E_ID | 範囲外のタスクID番号。 |
E_NOEXS | 指定したタスクID番号は登録されていない。 |
E_PAR | パラメータエラー。 |
タスク状態を格納する構造体(T_RTSK)は以下のとおりです。
メンバ名 | 説明 |
---|---|
tskstat | タスク状態。 |
tskpri | 現在の優先度。 |
tskbpri | ベース優先度。 |
tskwait | 待ち要因。 |
wobjid | 待ちオブジェクトID。 |
lefttmo | タイムアウトまでの時間。 |
actcnt | 起動要求カウント。 |
wupcnt | 起床要求カウント。 |
suscnt | サスペンド要求カウント。 |
・サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief タスクの状態参照.
*
* @param [in] tskid タスクID番号.
* @param [out] pk_rtsk タスク状態を格納する領域のポインタ.
*
* @retval エラーコード.
*/
ER ref_tsk( ID tskid, T_RTSK *pk_rtsk )
{
ER ercd;
WITSKSTAT sts;
//! 引数が不正な場合はエラーにする.
if( !pk_rtsk ){
return E_PAR;
}
wi_CommonLock();
//! 取得したタスクの状態を戻り値として構造体にセットする.
ercd = wi_RefarenceTask( tskid, &sts );
if( ercd == E_OK ){
pk_rtsk->tskstat = sts.TaskState;
pk_rtsk->tskpri = sts.TaskPri;
pk_rtsk->tskbpri = sts.TaskPri;
pk_rtsk->tskwait = sts.EventType;
pk_rtsk->wobjid = sts.WaitId;
pk_rtsk->lefttmo = 0;
pk_rtsk->actcnt = sts.ActiveCnt;
pk_rtsk->wupcnt = sts.WakeupCnt;
pk_rtsk->suscnt = sts.SuspendCnt;
}
wi_CommonUnlock();
return ercd;
}
タスク状態を格納する構造体のポインタがNULLの場合エラーにします。
タスク状態を取得する関数を呼び出して現在のタスクの状態を取得し引数の構造体に格納します。
タスクの状態を取得する (簡易版) Ver4.のみ)
簡易版のタスクの状態を取得するには以下のサービスコールを使用します。
ER ref_tst( ID tskid, T_RTST *pk_rtst )
引数 | 説明 |
---|---|
semid | タスクID番号。 |
pk_rtst | 簡易版のタスク状態を格納する構造体のポインタ。 |
戻り値 | 説明 |
---|---|
E_OK | 正常終了。 |
E_ID | 範囲外のタスクID番号。 |
E_NOEXS | 指定したタスクID番号は登録されていない。 |
E_PAR | パラメータエラー。 |
・簡易版のタスク状態を格納する構造体(T_RTST)は以下のとおりです。
メンバ名 | 説明 |
---|---|
tskstat | タスク状態。 |
tskwait | 待ち要因。 |
・サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief タスクの状態参照 (簡易版).
*
* @param [in] tskid タスクID番号.
* @param [out] pk_rtst タスク状態を格納する領域のポインタ.
*
* @retval エラーコード.
*/
ER ref_tst( ID tskid, T_RTST *pk_rtst )
{
ER ercd;
WITSKSTAT sts;
//! 引数が不正な場合はエラーにする.
if( !pk_rtst ){
return E_PAR;
}
wi_CommonLock();
//! タスクの状態を簡易参照する.
ercd = wi_RefarenceTask( tskid, &sts );
//! 取得したタスクの状態を戻り値として構造体にセットする.
if( ercd == E_OK ){
pk_rtst->tskstat = sts.TaskState;
pk_rtst->tskwait = sts.WaitId;
}
wi_CommonUnlock();
return ercd;
}
タスク状態を格納する構造体のポインタがNULLの場合エラーにします。
タスク状態を取得する関数を呼び出して現在のタスクの状態を取得し引数の構造体に格納します。
タスク状態取得関数
タスクの状態を取得する関数のソースコードは以下のとおりです。
/****************************************************************************/
/*!
* @brief タスクの状態参照.
*
* @param [in] id タスクID番号.
* @param [in] sts タスク状態を格納する領域のポインタ.
*
* @retval エラーコード.
*/
ER wi_RefarenceTask( INT id, WITSKSTAT *sts )
{
ER ercd;
WITSKOBJ *p;
//! タスクIDのオブジェクトを取得する.
p = FindTaskObject( id, &ercd );
if( !p ){
return ercd;
}
//! タスクの状態を構造体にセットする.
sts->ExtInfo = p->ExtInfo;
sts->TaskPri = p->TaskPri;
sts->TaskState = p->TaskState;
sts->EventType = p->EventType;
sts->WaitId = p->WaitId;
sts->WakeupCnt = p->WakeupCnt;
sts->SuspendCnt = p->SuspendCnt;
sts->TaskAtr = p->TaskAtr;
sts->TaskAdr = p->TaskAdr;
sts->InitPri = p->InitPri;
sts->StackSize = p->StackSize;
sts->ActiveCnt = p->ActiveCnt;
return E_OK;
}
タスクの状態を取得する関数は以下のような処理を行います。
- 引数で指定されたタスクID番号に該当するタスク・オブジェクトを取り出します。
- タスクの各状態変数を引数の構造体にセットします。