Windows版 iTRONサービスコールの作成 (可変長メモリプール)
(その2)

可変長メモリプールを生成する

可変長メモリプールを生成するサービスコールは以下のとおりです。


サービスコール名説明
cre_mpl

メモリプールID番号を指定して可変長メモリプールを生成します。

acre_mpl

メモリプールID番号を自動割付けで可変長メモリプールを生成します。

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

メモリプールID番号を指定して可変長メモリプールを生成する

メモリプールID番号を指定して可変長メモリプールを生成するには以下のサービスコールを使用します。

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



    ER cre_mpl( ID mplid, const T_CMPL *pk_cmpl )
	

引数説明
mplid

メモリプールID番号。

pk_cmpl

可変長メモリプール生成情報構造体のポインタ。

戻り値説明
E_OK

正常終了。

E_ID

範囲外のメモリプールID番号。

E_PAR

パラメータエラー。

E_OBJ

指定したメモリプールID番号は登録済み。


Ver3.0の可変長メモリプール生成情報構造体(T_CMPL)は以下のとおりです。

メンバ名説明
exinf

拡張情報。

mplatr

可変長メモリプールの属性。

mplsz

可変長メモリプールのサイズ(バイト数)。

Ver4.0の可変長メモリプール生成情報構造体(T_CMPL)は以下のとおりです。

メンバ名説明
mplatr

可変長メモリプールの属性。

mplsz

可変長メモリプールのサイズ(バイト数)。

mpl

可変長メモリプール領域の先頭アドレス。


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

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


/****************************************************************************/
/*!
 *  @brief  可変長メモリプールの生成.
 *
 *  @param  [in]    mplid   メモリ・プールID番号.
 *  @param  [in]    pk_cmpl メモリプール生成情報構造体のポインタ.
 *
 *  @retval エラーコード.
 */
ER      cre_mpl( ID mplid, const T_CMPL *pk_cmpl )
{
    ER          ercd;
    WIMPLOBJ    obj;

    //! 引数が不正な場合はエラーにする.
    if( !pk_cmpl ){
        return E_PAR;
    }
    //! 可変長メモリプール生成情報をコピーする.
    memset( &obj, 0, sizeof(WIMPLOBJ) );
    obj.ExtInfo   = pk_cmpl->exinf;
    obj.Attribute = pk_cmpl->mplatr;
    obj.MemSize   = pk_cmpl->mplsz;

    wi_CommonLock();

    //! 可変長メモリプールを生成する.
    ercd = wi_CreateVarMemPool( mplid, &obj );

    wi_CommonUnlock();
    return ercd;
}
	

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


/****************************************************************************/
/*!
 *  @brief  可変長メモリプールの生成.
 *
 *  @param  [in]    mplid   メモリプールID番号.
 *  @param  [in]    pk_cmpl メモリプール生成情報構造体のポインタ.
 *
 *  @retval エラーコード.
 */
ER      cre_mpl( ID mplid, const T_CMPL *pk_cmpl )
{
    ER          ercd;
    WIMPLOBJ    obj;

    //! 引数が不正な場合はエラーにする.
    if( !pk_cmpl ){
        return E_PAR;
    }
    //! 可変長メモリプール生成情報をコピーする.
    memset( &obj, 0, sizeof(WIMPLOBJ) );
    obj.Attribute = pk_cmpl->mplatr;
    obj.MemSize   = pk_cmpl->mplsz;

    wi_CommonLock();

    //! 可変長メモリプールを生成する.
    ercd = wi_CreateVarMemPool( mplid, &obj );

    wi_CommonUnlock();
    return ercd;
}
	

メモリプールID番号を自動割付けで可変長メモリプールを生成する (Ver4.0のみ)

メモリプールID番号を自動割付けで可変長メモリプールを生成するには以下のサービスコールを使用します。



    ER acre_mpl( const T_CMPL *pk_cmpl )
	

引数説明
pk_cmpl

可変長メモリプール生成情報構造体のポインタ。

戻り値説明
E_PAR

パラメータエラー。

E_NOID

ID番号不足。

上記以外の正数

生成した可変長メモリプールのID番号。(正常終了)


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


/****************************************************************************/
/*!
 *  @brief  可変長メモリプールの生成 (ID番号自動割り付け).
 *
 *  @param  [in]    pk_cmpl メモリプール生成情報構造体のポインタ.
 *
 *  @retval エラーコード.
 */
ER      acre_mpl( const T_CMPL *pk_cmpl )
{
    ID          mplid;
    ER          ercd;
    WIMPLOBJ    obj;

    //! 引数が不正な場合はエラーにする.
    if( !pk_cmpl ){
        return E_PAR;
    }
    //! 可変長メモリプール生成情報をコピーする.
    memset( &obj, 0, sizeof(WIMPLOBJ) );
    obj.Attribute = pk_cmpl->mplatr;
    obj.MemSize   = pk_cmpl->mplsz;

    wi_CommonLock();

    for( mplid = 1; mplid < TMAX_MAXMPL; mplid++ ){
        //! 可変長メモリプールを生成する.
        ercd = wi_CreateVarMemPool( mplid, &obj );
        if( ercd == E_OK ){
            ercd  = mplid;
            break;
        }
    }
    if( ercd == E_OBJ ){
        ercd  = E_NOID;
    }
    wi_CommonUnlock();
    return ercd;
}
	

メモリプールID番号を自動割付けで可変長メモリプールを生成する関数は以下のような処理を行います。

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

可変長メモリプール生成関数

可変長メモリプール生成関数のソースコードは以下のとおりです。



/****************************************************************************/
/*!
 *  @brief  可変長メモリプールの生成.
 *
 *  @param  [in]    id      メモリプールID番号.
 *  @param  [in]    obj     可変長メモリプール構造体のポインタ.
 *
 *  @retval エラーコード.
 */
ER      wi_CreateVarMemPool( INT id, const WIMPLOBJ *obj )
{
    ER          ercd;
    MEMHDR      *hdr;
    WIMPLOBJ    *p;

    //! 引数が不正な場合はエラーにする.
    if( obj->MemSize <= 0 ){
        return E_PAR;
    }
    //! 可変長メモリプール・オブジェクトを作成する.
    p = (WIMPLOBJ *)wi_CreateObject( id, TMAX_MAXMPL, sizeof(WIMPLOBJ), obj, ObjList, &ercd );
    if( !p ){
        return ercd;
    }
    //! メモリプールのバッファを確保する.
    p->MemBuf = (BYTE*)malloc( obj->MemSize );
    if( !p->MemBuf ){
        SAFE_RELEASE( p );
        return E_NOMEM;
    }
    //! 確保したバッファをクリアする.
    memset( p->MemBuf, 0, obj->MemSize );

    //! バッファの先頭にメモリブロックヘッダを付加する.
    hdr         = (MEMHDR *)p->MemBuf;
    hdr->Size   = obj->MemSize;
    hdr->TaskId = 0;

    //! リストに可変長メモリプールを追加する.
    wi_AddObject( (WIHDR *)p, &ObjList );

    return E_OK;
}
	

可変長メモリプールを生成する関数は以下のような処理を行います。

  • 不正な引数をチェックします。確保するメモリバッファのサイズが0の場合はエラーにします。
  • 新しい可変長メモリプールを生成します。
  • malloc()にてメモリバッファを確保します。
  • 確保したメモリバッファの先頭にメモリブロックのヘッダ情報を付加します。
  • 可変長メモリプール・リストに生成した可変長メモリプール・オブジェクトをリンクして処理を終了します。


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