Windows版 iTRONサービスコールの作成 (メールボックス)
(その2)

メールボックスを生成する

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


サービスコール名説明
cre_mbx

メールボックスID番号を指定してメールボックスを生成します。

acre_mbx

メールボックスID番号を自動割付けでメールボックスを生成します。

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

メールボックスID番号を指定してメールボックスを生成する

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

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



    ER cre_mbx( ID mbxid, const T_CMBX *pk_cmbx )
	

引数説明
mbxid

メールボックスID番号。

pk_cmbx

メールボックス生成情報構造体のポインタ。

戻り値説明
E_OK

正常終了。

E_ID

範囲外のメールボックスID番号。

E_PAR

パラメータエラー。

E_OBJ

指定したメールボックスID番号は登録済み。


Ver3.0のメールボックス生成情報構造体(T_CMBX)は以下のとおりです。

メンバ名説明
exinf

拡張情報。

mbxatr

メールボックスの属性。

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

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

メッセージキューに格納する方式を指定します。

  • TA_MFIFOの場合、メッセージをFOFO順にメッセージキューに格納します。
  • TA_MPRIの場合、メッセージを優先度順にメッセージキューに格納します。

Ver4.0のメールボックス生成情報構造体(T_CMBX)は以下のとおりです。

メンバ名説明
mbxatr

メールボックスの属性。

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

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

メッセージキューに格納する方式を指定します。

  • TA_MFIFOの場合、メッセージをFOFO順にメッセージキューに格納します。
  • TA_MPRIの場合、メッセージを優先度順にメッセージキューに格納します。
maxmpri

送信されるメッセージ優先度の最大値。

mprihd

優先度別のメッセージキューヘッダ領域のアドレス。


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

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


/****************************************************************************/
/*!
 *  @brief  メールボックスの生成.
 *
 *  @param  [in]    mbxid   メールボックスID番号.
 *  @param  [in]    pk_cmbx メールボックス生成情報構造体のポインタ.
 *
 *  @retval エラーコード.
 */
ER      cre_mbx( ID mbxid, const T_CMBX *pk_cmbx )
{
    ER          ercd;
    WIMBXOBJ    obj;

    //! 引数が不正な場合はエラーにする.
    if( !pk_cmbx ){
        return E_PAR;
    }
    //! メールボックス生成情報をコピーする.
    memset( &obj, 0, sizeof(WIMBXOBJ) );
    obj.Attribute    = pk_cmbx->mbxatr;
    obj.ExtInfo      = pk_cmbx->exinf;
    obj->MaxPriority = TMAX_MPRI;

    wi_CommonLock();

    //! メールボックスを生成する.
    ercd = wi_CreateMailBox( mbxid, &obj );

    wi_CommonUnlock();
    return ercd;
}
	

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


/****************************************************************************/
/*!
 *  @brief  メールボックスの生成.
 *
 *  @param  [in]    mbxid   メールボックスID番号.
 *  @param  [in]    pk_cmbx メールボックス生成情報構造体のポインタ.
 *
 *  @retval エラーコード.
 */
ER      cre_mbx( ID mbxid, const T_CMBX *pk_cmbx )
{
    ER          ercd;
    WIMBXOBJ    obj;

    //! 引数が不正な場合はエラーにする.
    if( !pk_cmbx ){
        return E_PAR;
    }
    //! メールボックス生成情報をコピーする.
    memset( &obj, 0, sizeof(WIMBXOBJ) );
    obj.Attribute   = pk_cmbx->mbxatr;
    obj.MaxPriority = pk_cmbx->maxmpri;

    wi_CommonLock();

    //! メールボックスを生成する.
    ercd = wi_CreateMailBox( mbxid, &obj );

    wi_CommonUnlock();
    return ercd;
}
	

メールボックスID番号を自動割付けでメールボックスを生成する (Ver4.0のみ)

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



    ER acre_mbx( const T_CMBX *pk_cmbx )
	

引数説明
pk_cmbx

メールボックス生成情報構造体のポインタ。

戻り値説明
E_PAR

パラメータエラー。

E_NOID

ID番号不足。

上記以外の正数

生成したメールボックスのID番号。(正常終了)


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


/****************************************************************************/
/*!
 *  @brief  メールボックスの生成 (ID番号自動割り付け).
 *
 *  @param  [in]    pk_cmbx メールボックス生成情報構造体のポインタ.
 *
 *  @retval 生成したメールボックスのメールボックスIDまたはエラーコード.
 */
ER_ID   acre_mbx( const T_CMBX *pk_cmbx )
{
    ID          mbxid;
    ER          ercd;
    WIMBXOBJ    obj;

    //! 引数が不正な場合はエラーにする.
    if( !pk_cmbx ){
        return E_PAR;
    }
    //! メールボックス生成情報をコピーする.
    memset( &obj, 0, sizeof(WIMBXOBJ) );
    obj.Attribute   = pk_cmbx->mbxatr;
    obj.MaxPriority = pk_cmbx->maxmpri;

    wi_CommonLock();

    for( mbxid = 1; mbxid < TMAX_MAXMBX; mbxid++ ){
        //! メールボックスを生成する.
        ercd = wi_CreateMailBox( mbxid, &obj );
        if( ercd == E_OK ){
            ercd = mbxid;
            break;
        }
    }
    if( ercd == E_OBJ ){
        ercd  = E_NOID;
    }
    wi_CommonUnlock();
    return ercd;
}
	

メールボックスID番号を自動割付けでメールボックスを生成する関数は以下のような処理を行います。

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

メールボックス生成関数

メールボックス生成関数のソースコードは以下のとおりです。



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

    //! 不正な引数の場合はエラーにする.
    if( (obj->Attribute & TA_MPRI) != 0 && (obj->MaxPriority == 0 || obj->MaxPriority > TMAX_MPRI) ){
        return E_PAR;
    }
    //! メールボックス・オブジェクトを作成する.
    p = (WIMBXOBJ *)wi_CreateObject( id, TMAX_MAXMBX, sizeof(WIMBXOBJ), obj, ObjList, &ercd );
    if( !p ){
        return ercd;
    }
    //! リストにメールボックスを追加する.
    wi_AddObject( (WIHDR *)p, &ObjList );
    return E_OK;
}
	

メールボックス生成関数は以下のような処理を行います。

  • メッセージのキューイング方式がメッセージ優先度の最大値が 0 または TMAX_MPRI より大きい場合はエラーにします。
  • 新しいメールボックスを生成します。
  • メールボックス・リストに生成したメールボックス・オブジェクトをリンクして処理を終了します。


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