Windows版 iTRONサービスコールの作成 (イベントフラグ)
(その5)

イベントフラグがセットされるのを待つ

イベントフラグのセット待ちをするサービスコールは以下のとおりです。


サービスコール名説明
wai_flg

タイムアウトなしでイベントフラグがセットされるのを待ちます。

pol_flg

ポーリング方式でイベントフラグがセットされるのを待ちます。

twai_flg

タイムアウト付きでイベントフラグがセットされるのを待ちます。

イベントフラグがセットされるのを待つ (タイムアウトなし)

タイムアウトなしでイベントフラグのセット待ちをするには以下のサービスコールを使用します。

※ Ver3.0とVer4.0では引数の並びが違いますので注意してください。


・Ver3.0の場合


    ER wai_flg( UINT *p_flgptn, ID flgid, UINT waiptn, UINT wfmode )
	

・Ver4.0の場合


    ER wai_flg( ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn )
	

引数説明
p_flgptn

イベント待ち解除時のビットパターンを格納する領域のポインタ。

flgid

イベントフラグID番号。

waiptn

イベント待ちをするビットパターン。

wfmode

イベントフラグの待ち条件。

  • TWF_ANDWの場合、AND待ち(waiptnのすべてのビットがセットされるまで待つ)となります。
  • TWF_ORWの場合、OR待ち(waiptnのいずれかのビットがセットされるまで待つ)となります。

Ver3.0の場合、TWF_ANDWまたはTWF_ORWと併せてTWF_CLRが指定可能。

TWF_CLRを指定すると、待ち条件が成立したときにイベントフラグのフラグ値を0にクリアします。

戻り値説明
E_OK

正常終了。

E_ID

範囲外のイベントフラグID番号。

E_NOEXS

指定したイベントフラグID番号は登録されていない。

E_CTX

非コンテキスト・タスクからの呼び出し。

E_ILUSE

複数タスクの待ちを許可しない設定で、既に待ち行列にタスクがある。


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


/****************************************************************************/
/*!
 *  @brief  イベントフラグ待ち (タイムアウトなし).
 *
 *  @param  [out]   p_flgptn    待ち解除時のビットパターンを格納する領域のポインタ.
 *  @param  [in]    flgid       イベントフラグID番号.
 *  @param  [in]    waiptn      待ちビットパターン.
 *  @param  [in]    wfmode      待ちモード.
 *
 *  @retval エラーコード.
 */
ER      wai_flg( UINT *p_flgptn, ID flgid, UINT waiptn, UINT wfmode )
{
    //! タイムアウトなしでイベント待ちをする.
    return twai_flg( p_flgptn, flgid, waiptn, wfmode, TMO_FEVR );
}
	

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


/****************************************************************************/
/*!
 *  @brief  イベントフラグ待ち (タイムアウトなし).
 *
 *  @param  [in]    flgid       イベントフラグID番号.
 *  @param  [in]    waiptn      待ちビットパターン.
 *  @param  [in]    wfmode      待ちモード.
 *  @param  [out]   p_flgptn    待ち解除時のビットパターンを格納する領域のポインタ.
 *
 *  @retval エラーコード.
 */
ER      wai_flg( ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn )
{
    //! タイムアウトなしでイベント待ちをする.
    return twai_flg( flgid, waiptn, wfmode, p_flgptn, TMO_FEVR );
}
	

twai_flg()のタイムアウト設定に TMO_FEVR を指定して呼び出します。

指定したイベントフラグID番号のイベントフラグに対して、イベントフラグのビットパターンが待ち条件に一致するまでタスクをスリープさせます。

イベントフラグがセットされるのを待つ (ポーリング)

ポーリングでイベントフラグのセット待ちをするには以下のサービスコールを使用します。

※ Ver3.0とVer4.0では引数の並びが違いますので注意してください。


・Ver3.0の場合


    ER pol_flg( UINT *p_flgptn, ID flgid, UINT waiptn, UINT wfmode )
	

・Ver4.0の場合


    ER pol_flg( ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn )
	

引数説明
p_flgptn

イベント待ち解除時のビットパターンを格納する領域のポインタ。

flgid

イベントフラグID番号。

waiptn

イベント待ちをするビットパターン。

wfmode

イベントフラグの待ち条件。

戻り値説明
E_OK

正常終了。

E_ID

範囲外のイベントフラグID番号。

E_NOEXS

指定したイベントフラグID番号は登録されていない。

E_TMOUT

指定した待ち条件が成立していない。


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


/****************************************************************************/
/*!
 *  @brief  イベントフラグ待ち (ポーリング).
 *
 *  @param  [out]   p_flgptn    待ち解除時のビットパターンを格納する領域のポインタ.
 *  @param  [in]    flgid       イベントフラグID番号.
 *  @param  [in]    waiptn      待ちビットパターン.
 *  @param  [in]    wfmode      待ちモード.
 *
 *  @retval エラーコード.
 */
ER      pol_flg( UINT *p_flgptn, ID flgid, UINT waiptn, UINT wfmode )
{
    //! イベントが発生しているかどうかを調べる.
    return twai_flg( p_flgptn, flgid, waiptn, wfmode, TMO_POL );
}
	

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


/****************************************************************************/
/*!
 *  @brief  イベントフラグ待ち (ポーリング).
 *
 *  @param  [in]    flgid       イベントフラグID番号.
 *  @param  [in]    waiptn      待ちビットパターン.
 *  @param  [in]    wfmode      待ちモード.
 *  @param  [out]   p_flgptn    待ち解除時のビットパターンを格納する領域のポインタ.
 *
 *  @retval エラーコード.
 */
ER      pol_flg( ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn )
{
    //! イベントが発生しているかどうかを調べる.
    return twai_flg( flgid, waiptn, wfmode, p_flgptn, TMO_POL );
}
	

twai_flg()のタイムアウト設定に TMO_POL を指定して呼び出します。

指定した待ち条件が成立していない場合は、タスクをスリープさせずに戻り値をE_TMOUTとしてすぐにサービスコールから戻ります。

イベントフラグがセットされるのを待つ (タイムアウト付き)

タイムアウト付きでイベントフラグのセット待ちをするには以下のサービスコールを使用します。

※ Ver3.0とVer4.0では引数の並びが違いますので注意してください。


・Ver3.0の場合


    ER twai_flg( UINT *p_flgptn, ID flgid, UINT waiptn, UINT wfmode, TMO tmout )
	

・Ver4.0の場合


    ER twai_flg( ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn, TMO tmout )
	

引数説明
p_flgptn

イベント待ち解除時のビットパターンを格納する領域のポインタ。

flgid

イベントフラグID番号。

waiptn

イベント待ちをするビットパターン。

wfmode

イベントフラグの待ち条件。

tmout

タイムアウトの設定値。

  • TMO_FEVRの場合、永久にset_flg()を待ちます。
  • TMO_POLの場合、待ち条件が成立していなくてもタスクをスリープしません。
  • その他の正数はタイムアウト値となります。

戻り値説明
E_OK

正常終了。

E_ID

範囲外のイベントフラグID番号。

E_NOEXS

指定したイベントフラグID番号は登録されていない。

E_TMOUT

指定した待ち条件が成立せずにタイムアウト。

E_CTX

非コンテキスト・タスクからの呼び出し。

E_ILUSE

複数タスクの待ちを許可しない設定で、既に待ち行列にタスクがある。


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


/****************************************************************************/
/*!
 *  @brief  イベントフラグ待ち (タイムアウトあり).
 *
 *  @param  [out]   p_flgptn    待ち解除時のビットパターンを格納する領域のポインタ.
 *  @param  [in]    flgid       イベントフラグID番号.
 *  @param  [in]    waiptn      待ちビットパターン.
 *  @param  [in]    wfmode      待ちモード.
 *  @param  [in]    tmout       タイムアウト設定.
 *
 *  @retval エラーコード.
 */
ER      twai_flg( UINT *p_flgptn, ID flgid, UINT waiptn, UINT wfmode, TMO tmout )
{
    ER ercd;

    wi_CommonLock();

    //! イベント待ちをする.
    ercd = wi_WaitEvFlag( flgid, p_flgptn, waiptn, wfmode, tmout );

    wi_CommonUnlock();
    return ercd;
}
	

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


/****************************************************************************/
/*!
 *  @brief  イベントフラグ待ち (タイムアウトあり).
 *
 *  @param  [in]    flgid       イベントフラグID番号.
 *  @param  [in]    waiptn      待ちビットパターン.
 *  @param  [in]    wfmode      待ちモード.
 *  @param  [out]   p_flgptn    待ち解除時のビットパターンを格納する領域のポインタ.
 *  @param  [in]    tmout       タイムアウト設定.
 *
 *  @retval エラーコード.
 */
ER      twai_flg( ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn, TMO tmout )
{
    ER ercd;

    wi_CommonLock();

    //! イベント待ちをする.
    ercd = wi_WaitEvFlag( flgid, p_flgptn, waiptn, wfmode, tmout );

    wi_CommonUnlock();
    return ercd;
}
	

指定したイベントフラグID番号のイベントフラグに対して、他のタスクがset_flg()を呼び出して指定した条件でフラグの値がセットされるか、タイムアウトで設定した時間が経過するまでタスクをスリープさせます。

イベントフラグのセット待ちをする関数

イベントフラグのセット待ちをする関数のソースコードは以下のとおりです。



/****************************************************************************/
/*!
 *  @brief  イベントフラグ待ち.
 *
 *  @param  [in]    id          イベントフラグID番号.
 *  @param  [out]   flgptn      待ち解除時のビットパターンを格納する領域のポインタ.
 *  @param  [in]    waiptn      待ちビットパターン.
 *  @param  [in]    wfmode      待ちモード.
 *  @param  [in]    tmout       タイムアウト設定.
 *
 *  @retval エラーコード.
 */
ER      wi_WaitEvFlag( INT id, UINT *flgptn, UINT waiptn, UINT wfmode, TMO tmout )
{
    WITSKOBJ    *tsk;
    WIFLGOBJ    *p;
    ER          ercd;
    BOOL        event_on;

    //! 引数が不正な場合はエラーにする.
    if( !flgptn || waiptn == 0 ){
        return E_PAR;
    }
    //! イベントフラグIDのオブジェクトを取得する.
    p = (WIFLGOBJ *)wi_FindObject( id, TMAX_MAXFLG, ObjList, &ercd );
    if( !p ){
        return ercd;
    }
    *flgptn  = 0;
    event_on = FALSE;
    if( wfmode & TWF_ORW ){
        //! OR待ちの場合、いずれかのビットが一致すれば「イベントあり」にする.
        if( (waiptn & p->FlgVal) != 0 ){
            event_on = TRUE;
        }
    }else{
        //! AND待ちの場合、全てのビットが一致すれば「イベントあり」にする.
        if( (waiptn & p->FlgVal) == waiptn ){
            event_on = TRUE;
        }
    }
    if( event_on ){
        //! イベント発生時のフラグパターンを戻り値にセットする.
        *flgptn = p->FlgVal;

        //! フラグのクリア設定がされている場合はフラグをクリアする.
        if( (wfmode & TWF_CLR) != 0 || (p->Attribute & TA_CLR) != 0 ){
            p->FlgVal = 0;
        }
        return E_OK;
    }
    //! 複数タスクの待ちを許可しない設定で、待ち行列に他のタスクがある場合はエラーにする.
    if( (p->Attribute & TA_WMUL) == 0 && p->WaitQue ){
        return E_ILUSE;
    }
    //! 自タスクのタスク・オブジェクトを取得する.
    tsk = wi_GetTaskObject( TSK_SELF );
    if( !tsk ){
        return E_CTX;
    }
    //! 待ちフラグパターンをタスク・オブジェクトに保存する.
    tsk->Param[0] = (VP)waiptn;
    tsk->Param[1] = (VP)wfmode;
    tsk->Param[2] = 0;

    //! イベントフラグが成立するまでタスクをスリープさせる.
    ercd = wi_TaskWait( id, TTW_FLG, tmout, p->Attribute, &(p->WaitQue) );

    //! イベント発生時のフラグパターンを戻り値にセットする.
    if( ercd == E_OK ){
        *flgptn = (UINT)(tsk->Param[2]);
    }
    return ercd;
}
	

イベントフラグのセット待ちをする関数は以下のような処理を行います。

  • 引数の flgptn が NULL または 待ち条件のビットパターン(waiptn)が 0 の場合はエラーにします。
  • 引数で指定されたイベントフラグID番号に該当するイベントフラグ・オブジェクトを取り出します。
  • イベントフラグのビットパターンが待ち条件と一致するときは正常終了にします。
  • 複数タスクの待ちを許可しない設定で、待ち行列に他のタスクがある場合はエラーで終了します。
  • イベントフラグのビットパターンが待ち条件と一致するか、タイムアウトになるまでタスクをスリープさせます。
  • タスクのスリープから復帰したときに正常終了で復帰した場合のみ、イベントフラグのフラグパターンを引数の flgptn にセットします。


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