Windows版 iTRONサービスコールの作成 (メッセージバッファ)
(その2)

メッセージバッファを生成する

メッセージバッファを生成するサービスコールは以下のとおりです。


サービスコール名説明
cre_mbf

メッセージバッファID番号を指定してメッセージバッファを生成します。

acre_mbf

メッセージバッファID番号を自動割付けでメッセージバッファを生成します。

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

メッセージバッファID番号を指定してメッセージバッファを生成する

メッセージバッファID番号を指定してメッセージバッファを生成するには以下のサービスコールを使用します。



    ER cre_mbf( ID mbfid, const T_CMBF *pk_cmbf )
	

引数説明
mbfid

メッセージバッファID番号。

pk_cmbf

メッセージバッファ生成情報構造体のポインタ。

戻り値説明
E_OK

正常終了。

E_ID

範囲外のメッセージバッファID番号。

E_PAR

パラメータエラー。

E_OBJ

指定したメッセージバッファID番号は登録済み。


Ver3.0のメッセージバッファ生成情報構造体(T_CMBF)は以下のとおりです。

メンバ名説明
exinf

拡張情報。

mbfatr

メッセージバッファの属性。

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

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

メッセージバッファのサイズ。

maxmsz

メッセージの最大長。

Ver4.0のメッセージバッファ生成情報構造体(T_CMBF)は以下のとおりです。

メンバ名説明
mbfatr

メッセージバッファの属性。

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

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

メッセージの最大長。

mbfsz

メッセージバッファのサイズ。

mbf

メッセージバッファ領域のアドレス。

※メッセージバッファ領域はライブラリ内で確保するので本ライブラリでは使用しません。


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

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


/****************************************************************************/
/*!
 *  @brief  メッセージバッファの生成.
 *
 *  @param  [in]    mbfid   メッセージバッファID番号.
 *  @param  [in]    pk_cmbf メッセージバッファ生成情報構造体のポインタ.
 *
 *  @retval エラーコード.
 */
ER      cre_mbf( ID mbfid, const T_CMBF *pk_cmbf )
{
    ER          ercd;
    WIMBFOBJ    obj;

    //! 引数が不正な場合はエラーにする.
    if( !pk_cmbf ){
        return E_PAR;
    }
    //! メッセージバッファ生成情報をコピーする.
    memset( &obj, 0, sizeof(WIMBFOBJ) );
    obj.SndAttr = pk_cmbf->mbfatr & ~TA_TPRI;
    obj.RcvAttr = pk_cmbf->mbfatr;
    obj.MsgSize = pk_cmbf->bufsz;
    obj.MaxMsg  = pk_cmbf->maxmsz;
    obj.ExtInfo = pk_cmbf->exinf;

    wi_CommonLock();

    //! メッセージバッファを生成する.
    ercd = wi_CreateMsgBuffer( mbfid, &obj );

    wi_CommonUnlock();
    return ercd;
}
	

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


/****************************************************************************/
/*!
 *  @brief  メッセージバッファの生成.
 *
 *  @param  [in]    mbfid   メッセージバッファID番号.
 *  @param  [in]    pk_cmbf メッセージバッファ生成情報構造体のポインタ.
 *
 *  @retval エラーコード.
 */
ER      cre_mbf( ID mbfid, const T_CMBF *pk_cmbf )
{
    ER          ercd;
    WIMBFOBJ    obj;

    //! 引数が不正な場合はエラーにする.
    if( !pk_cmbf ){
        return E_PAR;
    }
    //! メッセージバッファ生成情報をコピーする.
    memset( &obj, 0, sizeof(WIMBFOBJ) );
    obj.SndAttr = pk_cmbf->mbfatr;
    obj.RcvAttr = pk_cmbf->mbfatr & ~TA_TPRI;
    obj.MsgSize = pk_cmbf->mbfsz;
    obj.MaxMsg  = pk_cmbf->maxmsz;

    wi_CommonLock();

    //! メッセージバッファを生成する.
    ercd = wi_CreateMsgBuffer( mbfid, &obj );

    wi_CommonUnlock();
    return ercd;
}
	

メッセージバッファID番号を自動割付けでメッセージバッファを生成する

メッセージバッファID番号を自動割付けでメッセージバッファを生成するには以下のサービスコールを使用します。



    ER_ID acre_mbf( const T_CMBF *pk_cmbf )
	

引数説明
pk_cmbf

メッセージバッファ生成情報構造体のポインタ。

戻り値説明
E_PAR

パラメータエラー。

E_NOID

ID番号不足。

上記以外の正数

生成したメッセージバッファのID番号。(正常終了)


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


/****************************************************************************/
/*!
 *  @brief  メッセージバッファの生成 (ID番号自動割り付け).
 *
 *  @param  [in]    pk_cmbf メッセージバッファ生成情報構造体のポインタ.
 *
 *  @retval エラーコード.
 */
ER_ID   acre_mbf( const T_CMBF *pk_cmbf )
{
    ID          mbfid;
    ER          ercd;
    WIMBFOBJ    obj;

    //! 引数が不正な場合はエラーにする.
    if( !pk_cmbf ){
        return E_PAR;
    }
    //! メッセージバッファ生成情報をコピーする.
    memset( &obj, 0, sizeof(WIMBFOBJ) );
    obj.SndAttr = pk_cmbf->mbfatr;
    obj.RcvAttr = pk_cmbf->mbfatr & ~TA_TPRI;
    obj.MsgSize = pk_cmbf->mbfsz;
    obj.MaxMsg  = pk_cmbf->maxmsz;

    wi_CommonLock();

    for( mbfid = 1; mbfid < TMAX_MAXMBF; mbfid++ ){
        //! メッセージバッファを生成する.
        ercd = wi_CreateMsgBuffer( mbfid, &obj );
        if( ercd == E_OK ){
            ercd  = mbfid;
            break;
        }
    }
    if( ercd == E_OBJ ){
        ercd  = E_NOID;
    }
    wi_CommonUnlock();
    return ercd;
}
	

メッセージバッファID番号を自動割付けでメッセージバッファを生成する関数は以下のような処理を行います。

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

メッセージバッファ生成関数

メッセージバッファ生成関数のソースコードは以下のとおりです。



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

    //! 不正な引数の場合はエラーにする.
    if( obj->MaxMsg == 0 ){
        return E_PAR;
    }
    //! メッセージバッファ・オブジェクトを作成する.
    p = (WIMBFOBJ *)wi_CreateObject( id, TMAX_MAXMBF, sizeof(WIMBFOBJ), obj, ObjList, &ercd );
    if( !p ){
        return ercd;
    }
    //! メッセージバッファを確保する.
    if( p->MsgSize > 0 ){
        p->MsgBuf = (BYTE *)malloc( p->MsgSize );
        if( !p->MsgBuf ){
            SAFE_RELEASE( p );
            return E_NOMEM;
        }
        //! 確保したメッセージバッファをクリアする.
        memset( p->MsgBuf, 0, p->MsgSize );
    }
    p->GetPos = 0;
    p->PutPos = 0;

    //! リストにメッセージバッファを追加する.
    wi_AddObject( (WIHDR *)p, &ObjList );

    return E_OK;
}
	

メッセージバッファ生成関数は以下のような処理を行います。

  • 確保するバッファのサイズが 0 の場合はエラーにします。
  • 新しいメッセージバッファを生成します。
  • メッセージを格納するバッファをmalloc()にて確保し、確保したバッファをクリアします。
  • メッセージバッファ・リストに生成したメッセージバッファ・オブジェクトをリンクして処理を終了します。


商標に関する表示