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

イベントフラグを生成する

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


サービスコール名説明
cre_flg

イベントフラグID番号を指定してイベントフラグを生成します。

acre_flg

イベントフラグID番号を自動割付けでイベントフラグを生成します。

※ acre_flg()はVer4.0のみサポートされます。

イベントフラグID番号を指定してイベントフラグを生成する

イベントフラグID番号を指定してイベントフラグを生成するには以下のサービスコールを使用します。

※ Ver3.0とVer4.0では構造体のメンバが若干異なりますので注意してください。



    ER cre_flg( ID flgid, const T_CFLG *pk_cflg )
	

引数説明
flgid

イベントフラグID番号。

pk_cflg

イベントフラグ生成情報構造体のポインタ。

戻り値説明
E_OK

正常終了。

E_ID

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

E_PAR

パラメータエラー。

E_OBJ

指定したイベントフラグID番号は登録済み。


Ver3.0のイベントフラグ生成情報構造体(T_CFLG)は以下のとおりです。

メンバ名説明
exinf

拡張情報。

flgatr

イベントフラグの属性。

タスクの待ち行列に格納する方式を指定します。

  • TA_TFIFOの場合、タスクの待ち行列をFOFO順にします。
  • TA_TPRIの場合、タスクの待ち行列をタスク優先度順にします。

タスクの待ち行列に格納する方式を指定します。

  • TA_WSGLの場合、複数のタスクでフラグセット待ちはできません。
  • TA_WMULの場合、複数のタスクでフラグセット待ちを行えます。
iflgptn

イベントフラグの初期値。

Ver4.0のイベントフラグ生成情報構造体(T_CFLG)は以下のとおりです。

メンバ名説明
flgatr

イベントフラグの属性。

タスクの待ち行列に格納する方式を指定します。

  • TA_TFIFOの場合、タスクの待ち行列をFOFO順にします。
  • TA_TPRIの場合、タスクの待ち行列をタスク優先度順にします。

タスクの待ち行列に格納する方式を指定します。

  • TA_WSGLの場合、複数のタスクでフラグセット待ちはできません。
  • TA_WMULの場合、複数のタスクでフラグセット待ちを行えます。

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

iflgptn

イベントフラグの初期値。


Ver3.0とVer4.0で構造体のメンバが異なるので、それぞれのサービスコールのエントリ関数内で構造体のメンバを取り出してから、イベントフラグ生成処理を呼び出しています。

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


/****************************************************************************/
/*!
 *  @brief  イベントフラグの生成.
 *
 *  @param  [in]    flgid   イベントフラグID番号.
 *  @param  [in]    pk_cflg イベントフラグ生成情報構造体のポインタ.
 *
 *  @retval エラーコード.
 */
ER      cre_flg( ID flgid, const T_CFLG *pk_cflg )
{
    ER          ercd;
    WIFLGOBJ    obj;

    //! 引数が不正な場合はエラーにする.
    if( !pk_cflg ){
        return E_PAR;
    }
    //! イベントフラグ生成情報をコピーする.
    memset( &obj, 0, sizeof(WIFLGOBJ) );
    obj.Attribute = pk_cflg->flgatr & ~TA_CLR;
    obj.FlgVal    = pk_cflg->iflgptn;
    obj.ExtInfo   = pk_cflg->exinf;

    wi_CommonLock();

    //! イベントフラグを生成する.
    ercd = wi_CreateEvFlag( flgid, &obj );

    wi_CommonUnlock();
    return ercd;
}
	

※ Ver3.0でイベントフラグの属性に TA_CLR は指定できないので、指定されていた場合は TA_CLR をクリアします。


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


/****************************************************************************/
/*!
 *  @brief  イベントフラグの生成.
 *
 *  @param  [in]    flgid   イベントフラグID番号.
 *  @param  [in]    pk_cflg イベントフラグ生成情報構造体のポインタ.
 *
 *  @retval エラーコード.
 */
ER      cre_flg( ID flgid, const T_CFLG *pk_cflg )
{
    ER          ercd;
    WIFLGOBJ    obj;

    //! 引数が不正な場合はエラーにする.
    if( !pk_cflg ){
        return E_PAR;
    }
    //! イベントフラグ生成情報をコピーする.
    memset( &obj, 0, sizeof(WIFLGOBJ) );
    obj.Attribute = pk_cflg->flgatr;
    obj.FlgVal    = (UINT)pk_cflg->iflgptn;

    wi_CommonLock();

    //! イベントフラグを生成する.
    ercd = wi_CreateEvFlag( flgid, &obj );

    wi_CommonUnlock();
    return ercd;
}
	

イベントフラグID番号を自動割付けでイベントフラグを生成する (Ver4.0のみ)

イベントフラグID番号を自動割付けでイベントフラグを生成するには以下のサービスコールを使用します。



    ER_ID acre_flg( const T_CFLG *pk_cflg )
	

引数説明
pk_cflg

イベントフラグ生成情報構造体のポインタ。

戻り値説明
E_PAR

パラメータエラー。

E_NOID

ID番号不足。

上記以外の正数

生成したイベントフラグのID番号。(正常終了)


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


/****************************************************************************/
/*!
 *  @brief  イベントフラグの生成 (ID番号自動割り付け).
 *
 *  @param  [in]    pk_cflg イベントフラグ生成情報構造体のポインタ.
 *
 *  @retval イベントフラグID番号またはエラーコード.
 */
ER_ID   acre_flg( const T_CFLG *pk_cflg )
{
    ID          flgid;
    ER_ID       ercd;
    WIFLGOBJ    obj;

    //! 引数が不正な場合はエラーにする.
    if( !pk_cflg ){
        return E_PAR;
    }
    //! イベントフラグ生成情報をコピーする.
    memset( &obj, 0, sizeof(WIFLGOBJ) );
    obj.Attribute = pk_cflg->flgatr;
    obj.FlgVal    = (UINT)pk_cflg->iflgptn;

    wi_CommonLock();
    for( flgid = 1; flgid < TMAX_MAXFLG; flgid++ ){

        //! イベントフラグを生成する.
        ercd = wi_CreateEvFlag( flgid, &obj );
        if( ercd == E_OK ){
            ercd = (ER_ID)flgid;
            break;
        }
    }
    if( ercd == E_OBJ ){
        ercd  = E_NOID;
    }
    wi_CommonUnlock();
    return ercd;
}
	

イベントフラグID番号を自動割付けでイベントフラグを生成する関数は以下のような処理を行います。

  • cre_flg()と同様に、サービスコールのエントリ関数内で引数の構造体のメンバをコピーし、イベントフラグ生成関数を呼び出します。
  • 生成するイベントフラグのID番号を1~TMAX_MAXFLGに+1づつカウントアップして、空いているID番号を探してイベントフラグを生成します。
  • イベントフラグが生成できた場合、戻り値を生成したイベントフラグのID番号にして処理を終了します。
  • 1~TMAX_MAXFLGの全てのID番号が使用中の場合、エラーコードが「E_OBJ(イベントフラグ登録済み)」となるので、これを「E_NOID(ID番号不足)」に置き換えてエラー終了します。

イベントフラグ生成関数

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



/****************************************************************************/
/*!
 *  @brief  イベントフラグの生成.
 *
 *  @param  [in]    id      イベントフラグID番号.
 *  @param  [in]    obj     イベントフラグ・オブジェクト構造体のポインタ.
 *
 *  @retval エラーコード.
 */
ER      wi_CreateEvFlag( INT id, WIFLGOBJ *obj )
{
    ER          ercd;
    WIFLGOBJ    *p;

    //! イベントフラグ・オブジェクトを作成する.
    p = (WIFLGOBJ *)wi_CreateObject( id, TMAX_MAXFLG, sizeof(WIFLGOBJ), obj, ObjList, &ercd );
    if( !p ){
        return ercd;
    }
    //! リストにイベントフラグを追加する.
    wi_AddObject( (WIHDR *)p, &ObjList );
    return E_OK;
}
	

イベントフラグ生成関数は以下のような処理を行います。

  • 新しいイベントフラグを生成します。
  • イベントフラグ・リストに生成したイベントフラグ・オブジェクトをリンクして処理を終了します。


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