Windows版iTRONサービスコールの作成 (タスク管理)
(その7)

タスクの状態を参照する

タスクの状態を参照するサービスコールは以下のとおりです。


サービスコール名説明
ref_tsk

タスクの状態を取得します。

ref_tst

タスクの状態を取得します。 (簡易版)

※ Ver3.0と4.0では関数名は同じですが、引数の順番が逆になりますので注意してください。

※ ref_tst() は4.0のみサポートされます。

タスクの状態を取得する (Ver3.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番号に該当するタスク・オブジェクトを取り出します。
  • タスクの各状態変数を引数の構造体にセットします。


Windowsは米国Microsoft Corporationの登録商標です。