Windows版 iTRONサービスコールの作成 (ミューテックス)
(その2)

ミューテックスを生成する

ミューテックスを生成するサービスコールは以下のとおりです。


サービスコール名説明
cre_mtx

ミューテックスID番号を指定してミューテックスを生成します。

acre_mtx

ミューテックスID番号を自動割付けでミューテックスを生成します。

ミューテックスID番号を指定してセマフォを生成する

ミューテックスID番号を指定してミューテックスを生成するには以下のサービスコールを使用します。



    ER cre_mtx( ID mtxid, const T_CMTX *pk_cmtx )
	

引数説明
semid

ミューテックスID番号。

pk_cmtx

ミューテックス生成情報構造体のポインタ。

戻り値説明
E_OK

正常終了。

E_ID

範囲外のミューテックスID番号。

E_PAR

パラメータエラー。

E_OBJ

指定したミューテックスID番号は登録済み。


ミューテックス生成情報構造体(T_CMTX)は以下のとおりです。

メンバ名説明
mtxatr

ミューテックスの属性。

ceilpri

ミューテックスの上限優先度値。


サービスコールのエントリ関数内で構造体のメンバを取り出してから、ミューテックス生成処理を呼び出しています。

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


/****************************************************************************/
/*!
 *  @brief  ミューテックスの生成.
 *
 *  @param  [in]    mtxid   ミューテックスID番号.
 *  @param  [in]    pk_cmtx ミューテックス生成情報構造体のポインタ.
 *
 *  @retval エラーコード.
 */
ER      cre_mtx( ID mtxid, const T_CMTX *pk_cmtx )
{
    ER          ercd;
    WIMTXOBJ    obj;

    //! 引数が不正な場合はエラーにする.
    if( !pk_cmtx ){
        return E_PAR;
    }
    //! ミューテックス生成情報をコピーする.
    memset( &obj, 0, sizeof(WIMTXOBJ) );
    obj.Attribute = pk_cmtx->mtxatr;
    obj.CeilPri   = pk_cmtx->ceilpri;

    wi_CommonLock();

    //! ミューテックスを生成する.
    ercd = wi_CreateMutex( mtxid, &obj );

    wi_CommonUnlock();
    return ercd;
}
	

ミューテックスID番号を自動割付けでミューテックスを生成する

ミューテックスID番号を自動割付けでミューテックスを生成するには以下のサービスコールを使用します。



    ER acre_mtx( const T_CMTX *pk_cmtx )
	

引数説明
pk_cmtx

ミューテックス生成情報構造体のポインタ。

戻り値説明
E_PAR

パラメータエラー。

E_NOID

ID番号不足。

上記以外の正数

生成したミューテックスのID番号。(正常終了)


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


/****************************************************************************/
/*!
 *  @brief  ミューテックスの生成 (ID番号自動割り付け).
 *
 *  @param  [in]    pk_cmtx ミューテックス生成情報構造体のポインタ.
 *
 *  @retval 生成したミューテックスのID番号またはエラーコード.
 */
ER_ID   acre_mtx( const T_CMTX *pk_cmtx )
{
    ID          mtxid;
    ER          ercd;
    WIMTXOBJ    obj;

    //! 引数が不正な場合はエラーにする.
    if( !pk_cmtx ){
        return E_PAR;
    }
    //! ミューテックス生成情報をコピーする.
    memset( &obj, 0, sizeof(WIMTXOBJ) );
    obj.Attribute = pk_cmtx->mtxatr;
    obj.CeilPri   = pk_cmtx->ceilpri;

    wi_CommonLock();

    for( mtxid = 1; mtxid < TMAX_MAXMTX; mtxid++ ){
        //! ミューテックスを生成する.
        ercd = wi_CreateMutex( mtxid, &obj );
        if( ercd == E_OK ){
            ercd  = mtxid;
            break;
        }
    }
    if( ercd == E_OBJ ){
        ercd  = E_NOID;
    }
    wi_CommonUnlock();
    return ercd;
}
	

cre_mtx()と同様に、サービスコールのエントリ関数内で引数の構造体のメンバをコピーし、ミューテックス生成関数を呼び出します。

生成するミューテックスのID番号を1~TMAX_MAXMTXに+1づつカウントアップして、空いているID番号を探してミューテックスを生成します。

ミューテックスが生成できた場合、戻り値を生成したミューテックスのID番号にして処理を終了します。

1~TMAX_MAXMTXの全てのID番号が使用中の場合、エラーコードが「E_OBJ(ミューテックス登録済み)」となるので、これを「E_NOID(ID番号不足)」に置き換えてエラー終了します。

ミューテックス生成関数

ミューテックス生成関数のソースコードは以下のとおりです。



/****************************************************************************/
/*!
 *  @brief  ミューテックスの生成.
 *
 *  @param  [in]    id      ミューテックスID番号.
 *  @param  [in]    obj     ミューテックス・オブジェクト構造体のポインタ.
 *
 *  @retval エラーコード.
 */
ER      wi_CreateMutex( INT id, const WIMTXOBJ *obj )
{
    ER          ercd;
    WIMTXOBJ    *p;

    //! ミューテックス・オブジェクトを作成する.
    p = (WIMTXOBJ *)wi_CreateObject( id, TMAX_MAXMTX, sizeof(WIMTXOBJ), obj, ObjList, &ercd );
    if( !p ){
        return ercd;
    }
    //! リストにミューテックスを追加する.
    wi_AddObject( (WIHDR *)p, &ObjList );
    return E_OK;
}
	

ミューテックス生成関数は以下のような処理を行います。

  • 新しいミューテックスを生成します。
  • ミューテックス・リストに生成したミューテックス・オブジェクトをリンクして処理を終了します。


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