Windows版iTRONサービスコールの作成 (可変長メモリプール)
(その6)
可変長メモリプールの状態を参照するサービスコールは以下のとおりです。
サービスコール名 | 説明 |
---|---|
ref_mpl | 可変長メモリプールの状態を取得します。 |
Ver3.0と4.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を返します。)