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

可変長メモリプールの状態を参照する

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


サービスコール名説明
ref_mpl

可変長メモリプールの状態を取得します。

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

可変長メモリプールの状態を取得する (Ver3.0)

Ver3.0で可変長メモリプールの状態を取得するには以下のサービスコールを使用します。



    ER ref_mpl( T_RMPL *pk_rmpl, ID mplid )
	

引数説明
pk_rmpl

可変長メモリプール状態を格納する構造体のポインタ。

mplid

メモリプールID番号。

戻り値説明
E_OK

正常終了。

E_ID

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

E_NOEXS

指定したメモリプールID番号は登録されていない。

E_PAR

引数 pk_rmpl が不正な値。


可変長メモリプール状態を格納する構造体(T_RMPL)は以下のとおりです。

メンバ名説明
exinf拡張情報。
wtsk待ちタスクの有無。
frsz 空き領域の合計サイズ。
maxsz最大の連続空き領域のサイズ。


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


/****************************************************************************/
/*!
 *  @brief  可変長メモリプールの参照.
 *
 *  @param  [out]   pk_rmpl メモリプール状態を格納する構造体のポインタ.
 *  @param  [in]    mplid   メモリプールID番号.
 *
 *  @retval エラーコード.
 */
ER      ref_mpl( T_RMPL *pk_rmpl, ID mplid )
{
    ER          ercd;
    WIMPLSTAT   sts;

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

    //! 可変長メモリプールの状態を取得する.
    ercd = wi_RefarenceVarMemPool( mplid, &sts );
    if( ercd == E_OK ){
        pk_rmpl->exinf = sts.ExtInfo;
        pk_rmpl->wtsk  = (BOOL_ID)sts.WaitId;
        pk_rmpl->frsz  = sts.TotalFreeSize;
        pk_rmpl->maxsz = sts.MaxFreeSize;
    }
    wi_CommonUnlock();
    return ercd;
}
	

可変長メモリプール状態を格納する構造体のポインタがNULLの場合エラーにします。

可変長メモリプール状態を取得する関数を呼び出して現在の可変長メモリプールの状態を取得し引数の構造体に格納します。

可変長メモリプールの状態を取得する (Ver4.0)

Ver4.0で可変長メモリプールの状態を取得するには以下のサービスコールを使用します。



    ER ref_mpl( ID mpfid, T_RMPL *pk_rmpl )
	

引数説明
mpfid

メモリプールID番号。

pk_rmpl

可変長メモリプール状態を格納する構造体のポインタ。

戻り値説明
E_OK

正常終了。

E_ID

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

E_NOEXS

指定したメモリプールID番号は登録されていない。

E_PAR

引数 pk_rmpl が不正な値。


可変長メモリプール状態を格納する構造体(T_RMPL)は以下のとおりです。

メンバ名説明
wtskid可変長メモリプールの待ち行列の先頭のタスクのID番号。
fmplsz 空き領域の合計サイズ。
fblksz最大の連続空き領域のサイズ。


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


/****************************************************************************/
/*!
 *  @brief  可変長メモリプールの参照.
 *
 *  @param  [in]    mpfid   メモリプールID番号.
 *  @param  [out]   pk_rmpl メモリプール状態を格納する構造体のポインタ.
 *
 *  @retval エラーコード.
 */
ER      ref_mpl( ID mpfid, T_RMPL *pk_rmpl )
{
    ER          ercd;
    WIMPLSTAT   sts;

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

    //! 可変長メモリプールの状態を取得する.
    ercd = wi_RefarenceVarMemPool( mpfid, &sts );
    if( ercd == E_OK ){
        pk_rmpl->wtskid = sts.WaitId;
        pk_rmpl->fmplsz = sts.TotalFreeSize;
        pk_rmpl->fblksz = sts.MaxFreeSize;
    }
    wi_CommonUnlock();
    return ercd;
}
	

可変長メモリプール状態を格納する構造体のポインタがNULLの場合エラーにします。

可変長メモリプール状態を取得する関数を呼び出して現在の可変長メモリプールの状態を取得し引数の構造体に格納します。

可変長メモリプールの状態取得関数

可変長メモリプールの状態を取得する関数のソースコードは以下のとおりです。



/****************************************************************************/
/*!
 *  @brief  可変長メモリプールの参照.
 *
 *  @param  [in]    id      メモリプールID番号.
 *  @param  [out]   sts     メモリプール状態を格納する構造体のポインタ.
 *
 *  @retval エラーコード.
 */
ER      wi_RefarenceVarMemPool( INT id, WIMPLSTAT *sts )
{
    ER          ercd;
    WIMPLOBJ    *p;
    INT         total_free,max_free;

    //! メモリプールIDのオブジェクトを取得する.
    p = (WIMPLOBJ *)wi_FindObject( id, TMAX_MAXMPL, ObjList, &ercd );
    if( !p ){
        return ercd;
    }
    //! 空きメモリのサイズを取得する.
    total_free = GetFreeBufSize( &max_free, p->MemBuf, p->MemSize );

    //! 可変長メモリプールの状態を構造体にセットする.
    sts->WaitId        = wi_GetWaitTaskListFirstId( p->WaitQue );
    sts->TotalFreeSize = total_free;
    sts->MaxFreeSize   = max_free;
    sts->ExtInfo       = p->ExtInfo;
    return E_OK;
}
	

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

  • 引数で指定された可変長メモリプールID番号に該当する可変長メモリプール・オブジェクトを取り出します。
  • 未使用のメモリブロックのサイズを取得します。
  • メモリブロック獲得待ち行列から先頭のタスクのID番号を取り出して、引数の構造体にセットします。
  • 未使用のメモリブロックの空き領域のバイト数を引数の構造体にセットします。
  • 未使用のメモリブロックの連続した空き領域の最大バイト数を引数の構造体にセットします。
  • cre_mpl()で可変長メモリプールを生成するときに渡された拡張情報を引数の構造体にセットします。(Ver4.0の場合は常に0を返します。)


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