Windows版 iTRONサービスコールの作成 (セマフォ)
(その6)

セマフォの状態を参照する

セマフォの状態を参照するサービスコールは以下のとおりです。


サービスコール名説明
ref_sem

セマフォの状態を取得します。

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

セマフォの状態を取得する (Ver3.0)

Ver3.0でセマフォの状態を取得するには以下のサービスコールを使用します。



    ER ref_sem( T_RSEM *pk_rsem, ID semid )
	

引数説明
pk_rsem

セマフォ状態を格納する構造体のポインタ。

semid

セマフォID番号。

戻り値説明
E_OK

正常終了。

E_ID

範囲外のセマフォID番号。

E_NOEXS

指定したセマフォID番号は登録されていない。

E_PAR

パラメータエラー。


セマフォ状態を格納する構造体(T_RSEM)は以下のとおりです。

メンバ名説明
exinf拡張情報。
wtsk待ちタスクの有無。
semcnt現在のセマフォカウント値。


・サービスコールのソースコードは以下のようになります。


/****************************************************************************/
/*!
 *  @brief  セマフォ状態の参照.
 *
 *  @param  [out]   pk_rsem セマフォ状態を格納する構造体のポインタ.
 *  @param  [in]    semid   セマフォID番号.
 *
 *  @retval エラーコード.
 */
ER      ref_sem( T_RSEM *pk_rsem, ID semid )
{
    ER          ercd;
    WISEMSTAT   sts;

    //! 引数が不正な場合はエラーにする.
    if( !pk_rsem ){
        return E_PAR;
    }
    wi_CommonLock();

    //! セマフォの状態を取得する.
    ercd = wi_RefarenceSemaphore( semid, &sts );
    if( ercd == E_OK ){
        pk_rsem->exinf  = sts.ExtInfo;
        pk_rsem->wtsk   = sts.WaitId;
        pk_rsem->semcnt = sts.SemCnt;
    }
    wi_CommonUnlock();
    return ercd;
}
	

セマフォ状態を格納する構造体のポインタがNULLの場合エラーにします。

セマフォ状態を取得する関数を呼び出して現在のセマフォの状態を取得し引数の構造体に格納します。

セマフォの状態を取得する (Ver4.0)

Ver4.0でセマフォの状態を取得するには以下のサービスコールを使用します。



    ER ref_sem( ID semid, T_RSEM *pk_rsem )
	

引数説明
semid

セマフォID番号。

pk_rsem

セマフォ状態を格納する構造体のポインタ。

戻り値説明
E_OK

正常終了。

E_ID

範囲外のセマフォID番号。

E_NOEXS

指定したセマフォID番号は登録されていない。

E_PAR

パラメータエラー。


セマフォ状態を格納する構造体(T_RSEM)は以下のとおりです。

メンバ名説明
wtskidセマフォ待ち行列の先頭のタスクのID番号。
semcnt現在のセマフォカウント値。


・サービスコールのソースコードは以下のようになります。


/****************************************************************************/
/*!
 *  @brief  セマフォ状態の参照.
 *
 *  @param  [in]    semid   セマフォID番号.
 *  @param  [out]   pk_rsem セマフォ状態を格納する構造体のポインタ.
 *
 *  @retval エラーコード.
 */
ER      ref_sem( ID semid, T_RSEM *pk_rsem )
{
    ER          ercd;
    WISEMSTAT   sts;

    //! 引数が不正な場合はエラーにする.
    if( !pk_rsem ){
        return E_PAR;
    }
    wi_CommonLock();

    //! セマフォの状態を取得する.
    ercd = wi_RefarenceSemaphore( semid, &sts );
    if( ercd == E_OK ){
        pk_rsem->wtskid = sts.WaitId;
        pk_rsem->semcnt = sts.SemCnt;
    }
    wi_CommonUnlock();
    return ercd;
}
	

セマフォ状態を格納する構造体のポインタがNULLの場合エラーにします。

セマフォ状態を取得する関数を呼び出して現在のセマフォの状態を取得し引数の構造体に格納します。

セマフォ状態取得関数

セマフォの状態を取得する関数のソースコードは以下のとおりです。



/****************************************************************************/
/*!
 *  @brief  セマフォ状態の参照.
 *
 *  @param  [in]    id      セマフォID番号.
 *  @param  [in]    sts     セマフォ状態を格納する構造体のポインタ.
 *
 *  @retval エラーコード.
 */
ER      wi_RefarenceSemaphore( INT id, WISEMSTAT *sts )
{
    ER          ercd;
    WISEMOBJ    *p;

    //! セマフォIDのオブジェクトを取得する.
    p = (WISEMOBJ *)wi_FindObject( id, TMAX_MAXSEM, ObjList, &ercd );
    if( !p ){
        return ercd;
    }
    //! セマフォの状態を構造体にセットする.
    sts->WaitId  = wi_GetWaitTaskListFirstId( p->WaitQue );
    sts->SemCnt  = p->SemCnt;
    sts->ExtInfo = p->ExtInfo;
    return E_OK;
}
	

セマフォの状態を取得する関数は以下のような処理を行います。

  • 引数で指定されたセマフォID番号に該当するセマフォ・オブジェクトを取り出します。
  • セマフォの待ち行列から先頭のタスクのID番号を取り出して、引数の構造体にセットします。
  • 現在のセマフォ・カウンタの値を引数の構造体にセットします。
  • cre_sem()でセマフォを生成するときに渡された拡張情報を引数の構造体にセットします。(Ver4.0の場合は常に0を返します。)


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