Windows版 iTRONサービスコールの作成 (可変長メモリプール)
(その2)
可変長メモリプールを生成するサービスコールは以下のとおりです。
サービスコール名 | 説明 |
---|---|
cre_mpl | メモリプールID番号を指定して可変長メモリプールを生成します。 |
acre_mpl | メモリプールID番号を自動割付けで可変長メモリプールを生成します。 |
※ acre_mpl()はVer4.0のみサポートされています。
メモリプール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()にてメモリバッファを確保します。
- 確保したメモリバッファの先頭にメモリブロックのヘッダ情報を付加します。
- 可変長メモリプール・リストに生成した可変長メモリプール・オブジェクトをリンクして処理を終了します。