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