Windows版 iTRONサービスコールの作成 (ランデブポート)
(その2)

ランデブポートを生成する

ランデブポートを生成するサービスコールは以下のとおりです。


サービスコール名説明
cre_por

ランデブポートID番号を指定してランデブポートを生成します。

acre_por

ランデブポートID番号を自動割付けでランデブポートを生成します。

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

ランデブポートID番号を指定してランデブポートを生成する

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



    ER cre_por( ID porid, const T_CPOR *pk_cpor )
	

引数説明
porid

ランデブポートID番号。

pk_cpor

ランデブポート生成情報構造体のポインタ。

戻り値説明
E_OK

正常終了。

E_ID

範囲外のランデブポートID番号。

E_PAR

パラメータエラー。

E_OBJ

指定したランデブポートID番号は登録済み。


Ver3.0のランデブポート生成情報構造体(T_CPOR)は以下のとおりです。

メンバ名説明
exinf

拡張情報。

poratr

ランデブポートの属性。

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

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

ランデブ呼出時のメッセージの最大長。

maxrmsz

ランデブ返答時のメッセージの最大長。

Ver4.0のランデブポート生成情報構造体(T_CPOR)は以下のとおりです。

メンバ名説明
poratr

ランデブポートの属性。

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

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

ランデブ呼出時のメッセージの最大長。

maxrmsz

ランデブ返答時のメッセージの最大長。


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

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


/****************************************************************************/
/*!
 *  @brief  ランデブポートの生成.
 *
 *  @param  [in]    porid   ランデブポートID番号.
 *  @param  [in]    pk_cpor ランデブポート生成情報構造体のポインタ.
 *
 *  @retval エラーコード.
 */
ER      cre_por( ID porid, const T_CPOR *pk_cpor )
{
    ER          ercd;
    WIPOROBJ    obj;

    //! 引数が不正な場合はエラーにする.
    if( !pk_cpor ){
        return E_PAR;
    }
    //! ランデブポート生成情報をコピーする.
    memset( &obj, 0, sizeof(WIPOROBJ) );
    obj.Attribute = pk_cpor->poratr;
    obj.MaxCalMsg = pk_cpor->maxcmsz;
    obj.MaxRepMsg = pk_cpor->maxrmsz;
    obj.ExtInfo   = pk_cpor->exinf;

    wi_CommonLock();

    //! ランデブポートを生成する.
    ercd = wi_CreateRendPort( porid, &obj );

    wi_CommonUnlock();
    return ercd;
}
	

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


/****************************************************************************/
/*!
 *  @brief  ランデブポートの生成.
 *
 *  @param  [in]    porid   ランデブポートID番号.
 *  @param  [in]    pk_cpor ランデブポート生成情報構造体のポインタ.
 *
 *  @retval エラーコード.
 */
ER      cre_por( ID porid, const T_CPOR *pk_cpor )
{
    ER          ercd;
    WIPOROBJ    obj;

    //! 引数が不正な場合はエラーにする.
    if( !pk_cpor ){
        return E_PAR;
    }
    //! ランデブポート生成情報をコピーする.
    memset( &obj, 0, sizeof(WIPOROBJ) );
    obj.Attribute = pk_cpor->poratr;
    obj.MaxCalMsg = pk_cpor->maxcmsz;
    obj.MaxRepMsg = pk_cpor->maxrmsz;

    wi_CommonLock();

    //! ランデブポートを生成する.
    ercd = wi_CreateRendPort( porid, &obj );

    wi_CommonUnlock();
    return ercd;
}
	

ランデブポートID番号を自動割付けでランデブポートを生成する

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



    ER_ID acre_por( const T_CPOR *pk_cpor )
	

引数説明
pk_cpor

ランデブポート生成情報構造体のポインタ。

戻り値説明
E_PAR

パラメータエラー。

E_NOID

ID番号不足。

上記以外の正数

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


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


/****************************************************************************/
/*!
 *  @brief  ランデブポートの生成 (ID番号自動割り付け).
 *
 *  @param  [in]    pk_cpor ランデブポート生成情報構造体のポインタ.
 *
 *  @retval エラーコード.
 */
ER_ID   acre_por( const T_CPOR *pk_cpor )
{
    ID          porid;
    ER          ercd;
    WIPOROBJ    obj;

    //! 引数が不正な場合はエラーにする.
    if( !pk_cpor ){
        return E_PAR;
    }
    //! ランデブポート生成情報をコピーする.
    memset( &obj, 0, sizeof(WIPOROBJ) );
    obj.Attribute = pk_cpor->poratr;
    obj.MaxCalMsg = pk_cpor->maxcmsz;
    obj.MaxRepMsg = pk_cpor->maxrmsz;

    wi_CommonLock();

    for( porid = 1; porid < TMAX_MAXPOR; porid++ ){
        //! ランデブポートを生成する.
        ercd = wi_CreateRendPort( porid, &obj );
        if( ercd == E_OK ){
            ercd  = porid;
            break;
        }
    }
    if( ercd == E_OBJ ){
        ercd  = E_NOID;
    }
    wi_CommonUnlock();
    return ercd;
}
	

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

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

ランデブポート生成関数

ランデブポート生成関数のソースコードは以下のとおりです。



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

    //! 不正な引数の場合はエラーにする.
    if( obj->MaxCalMsg == 0 || obj->MaxRepMsg == 0 ){
        return E_PAR;
    }
    //! ランデブポート・オブジェクトを作成する.
    p = (WIPOROBJ *)wi_CreateObject( id, TMAX_MAXPOR, sizeof(WIPOROBJ), obj, PortList, &ercd );
    if( !p ){
        return ercd;
    }
    //! リストにランデブポートを追加する.
    wi_AddObject( (WIHDR *)p, &PortList );
    return E_OK;
}
	

ランデブポート生成関数は以下のような処理を行います。

  • 呼び出しまたは受け付けメッセージの最大サイズが 0 の場合はエラーにします。
  • 新しいランデブポートを生成します。
  • ランデブポート・リストに生成したランデブポート・オブジェクトをリンクして処理を終了します。


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