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

固定長メモリプールの状態を参照する

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


サービスコール名説明
ref_mpf

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

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

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

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



    ER ref_mpf( T_RMPF *pk_rmpf, ID mpfid )
	

引数説明
pk_rmpf

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

mpfid

メモリプールID番号。

戻り値説明
E_OK

正常終了。

E_ID

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

E_NOEXS

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

E_PAR

パラメータエラー。


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

メンバ名説明
exinf拡張情報。
wtsk待ちタスクの有無。
frbcnt空きメモリブロックの個数。


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


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

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

    //! 固定長メモリプールの状態を取得する.
    ercd = wi_RefarenceFixedMemPool( mpfid, &sts );
    if( ercd == E_OK ){
        pk_rmpf->exinf  = sts.ExtInfo;
        pk_rmpf->wtsk   = (BOOL_ID)sts.WaitId;
        pk_rmpf->frbcnt = sts.FreeBlock;
    }
    wi_CommonUnlock();
    return ercd;
}
	

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

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

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

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



    ER ref_mpf( ID mpfid, T_RMPF *pk_rmpf )
	

引数説明
mpfid

メモリプールID番号。

pk_rmpf

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

戻り値説明
E_OK

正常終了。

E_ID

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

E_NOEXS

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

E_PAR

パラメータエラー。


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

メンバ名説明
wtskidセマフォ待ち行列の先頭のタスクのID番号。
fblkcnt空きメモリブロックの個数。


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


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

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

    //! 固定長メモリプールの状態を取得する.
    ercd = wi_RefarenceFixedMemPool( mpfid, &sts );
    if( ercd == E_OK ){
        pk_rmpf->wtskid  = sts.WaitId;
        pk_rmpf->fblkcnt = sts.FreeBlock;
    }
    wi_CommonUnlock();
    return ercd;
}
	

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

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

固定長メモリプールの状態取得関数

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



/****************************************************************************/
/*!
 *  @brief  固定長メモリプールの参照.
 *
 *  @param  [in]    id      メモリプールID番号.
 *  @param  [out]   sts     メモリプール状態を格納する構造体のポインタ.
 *
 *  @retval エラーコード.
 */
ER      wi_RefarenceFixedMemPool( INT id, WIMPFSTAT *sts )
{
    ER          ercd;
    WIMPFOBJ    *p;
    WIHDR       *ptr;
    INT         cnt;

    //! メモリプールIDのオブジェクトを取得する.
    p = (WIMPFOBJ *)wi_FindObject( id, TMAX_MAXMPF, ObjList, &ercd );
    if( !p ){
        return ercd;
    }
    //! 未使用のメモリブロック数をカウントする.
    cnt = 0;
    ptr = p->FreeQue;
    while( ptr ){
        ptr = ptr->Next;
        cnt++;
    }
    //! 固定長メモリプールの状態を構造体にセットする.
    sts->WaitId    = wi_GetWaitTaskListFirstId( p->WaitQue );
    sts->FreeBlock = cnt;
    sts->ExtInfo   = p->ExtInfo;

    return E_OK;
}
	

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

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


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