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

メッセージバッファの状態を参照する

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


サービスコール名説明
ref_mbf

メッセージバッファの状態を取得します。

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

メッセージバッファの状態を取得する (Ver3.0)

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



    ER ref_mbf( T_RMBF *pk_rmbf, ID mbfid )
	

引数説明
pk_rmbf

メッセージバッファ状態を格納する構造体のポインタ。

mbfid

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

戻り値説明
E_OK

正常終了。

E_ID

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

E_NOEXS

指定メッセージバッファID番号は登録されていない。

E_PAR

パラメータエラー。


メッセージバッファ状態を格納する構造体(T_RMBF)は以下のとおりです。

メンバ名説明
exinf拡張情報。
wtsk受信待ちタスクの有無。
wtsk送信待ちタスクの有無。
msgsz次に受信されるメッセージのサイズ。
msgsz空きバッファのサイズ。


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


/****************************************************************************/
/*!
 *  @brief  メッセージバッファの状態参照.
 *
 *  @param  [out]   pk_rmbf メッセージバッファ状態を格納する構造体のポインタ.
 *  @param  [in]    mbfid   メッセージバッファID番号.
 *
 *  @retval エラーコード.
 */
ER      ref_mbf( T_RMBF *pk_rmbf, ID mbfid )
{
    ER          ercd;
    WIMBFSTAT   sts;

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

    //! メッセージバッファの状態を取得する.
    ercd = wi_RefarenceMsgBuffer( mbfid, &sts );
    if( ercd == E_OK ){
        pk_rmbf->exinf   = sts.ExtInfo;
        pk_rmbf->wtsk    = (BOOL_ID)sts.RcvWaitId;
        pk_rmbf->stsk    = (BOOL_ID)sts.SndWaitId;
        pk_rmbf->msgsz   = sts.MsgSize;
        pk_rmbf->frbufsz = sts.FreeSize;
    }
    wi_CommonUnlock();
    return ercd;
}
	

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

メッセージバッファ状態を取得する関数を呼び出して現在のメッセージバッファの状態を取得し引数の構造体に格納します。

メッセージバッファの状態を取得する (Ver4.0)

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



    ER ref_mbf( ID mbfid, T_RMBF *pk_rmbf )
	

引数説明
mbfid

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

pk_rmbf

メッセージバッファ状態を格納する構造体のポインタ。

戻り値説明
E_OK

正常終了。

E_ID

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

E_NOEXS

指定したメッセージバッファID番号は登録されていない。

E_PAR

パラメータエラー。


メッセージバッファ状態を格納する構造体(T_RMBF)は以下のとおりです。

メンバ名説明
stskidメッセージバッファの送信待ち行列の先頭のタスクのID番号。
rtskidメッセージバッファの受信待ち行列の先頭のタスクのID番号。
smsgcntメッセージバッファに入っているメッセージの数。
fmbfszメッセージバッファの空き領域のサイズ。


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


/****************************************************************************/
/*!
 *  @brief  メッセージバッファの状態参照.
 *
 *  @param  [in]    mbfid   メッセージバッファID番号.
 *  @param  [out]   pk_rmbf メッセージバッファ状態を格納する構造体のポインタ.
 *
 *  @retval エラーコード.
 */
ER      ref_mbf( ID mbfid, T_RMBF *pk_rmbf )
{
    ER          ercd;
    WIMBFSTAT   sts;

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

    //! メッセージバッファの状態を取得する.
    ercd = wi_RefarenceMsgBuffer( mbfid, &sts );
    if( ercd == E_OK ){
        pk_rmbf->rtskid  = sts.RcvWaitId;
        pk_rmbf->stskid  = sts.SndWaitId;
        pk_rmbf->smsgcnt = sts.MsgSize;
        pk_rmbf->fmbfsz  = sts.FreeSize;
    }
    wi_CommonUnlock();
    return ercd;
}
	

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

メッセージバッファ状態を取得する関数を呼び出して現在のメッセージバッファの状態を取得し引数の構造体に格納します。

メッセージバッファ状態取得関数

メッセージバッファ状態を取得する関数のソースコードは以下のとおりです。



/****************************************************************************/
/*!
 *  @brief  メッセージバッファの状態参照.
 *
 *  @param  [in]    id      メッセージバッファID番号.
 *  @param  [out]   sts     メッセージバッファ状態を格納する構造体のポインタ.
 *
 *  @retval エラーコード.
 */
ER      wi_RefarenceMsgBuffer( INT id, WIMBFSTAT *sts )
{
    ER          ercd;
    WIMBFOBJ    *p;

    //! メッセージバッファIDのオブジェクトを取得する.
    p = (WIMBFOBJ *)wi_FindObject( id, TMAX_MAXMBF, ObjList, &ercd );
    if( !p ){
        return ercd;
    }
    //! メッセージバッファの状態を構造体にセットする.
    sts->SndWaitId = wi_GetWaitTaskListFirstId( p->SndWaitQue );
    sts->RcvWaitId = wi_GetWaitTaskListFirstId( p->RcvWaitQue );
    sts->MsgSize   = GetNextMessageSize( p );
    sts->FreeSize  = GetFreeSize( p );
    sts->ExtInfo   = p->ExtInfo;
    return E_OK;
}
	

メッセージバッファ状態を取得する関数は以下のような処理を行います。

  • 引数で指定されたメッセージバッファID番号に該当するメッセージバッファ・オブジェクトを取り出します。
  • メッセージ送信待ち行列から先頭のタスクのID番号を取り出して、引数の構造体にセットします。
  • メッセージ受信待ち行列から先頭のタスクのID番号を取り出して、引数の構造体にセットします。
  • メッセージバッファの先頭にあるメッセージのバイト数を取り出して、引数の構造体にセットします。
  • メッセージバッファの空きバッファのサイズを計算して、引数の構造体にセットします。
  • cre_mbf()でメッセージバッファを生成するときに渡された拡張情報を引数の構造体にセットします。(Ver4.0の場合は常に0を返します。)


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