Windows版 iTRONサービスコールの作成 (メッセージバッファ)
(その2)
メッセージバッファを生成するサービスコールは以下のとおりです。
サービスコール名 | 説明 |
---|---|
cre_mbf | メッセージバッファID番号を指定してメッセージバッファを生成します。 |
acre_mbf | メッセージバッファID番号を自動割付けでメッセージバッファを生成します。 |
※ acre_mbf()はVer4.0のみサポートされています。
メッセージバッファID番号を指定してメッセージバッファを生成する
メッセージバッファID番号を指定してメッセージバッファを生成するには以下のサービスコールを使用します。
ER cre_mbf( ID mbfid, const T_CMBF *pk_cmbf )
引数 | 説明 |
---|---|
mbfid | メッセージバッファID番号。 |
pk_cmbf | メッセージバッファ生成情報構造体のポインタ。 |
戻り値 | 説明 |
---|---|
E_OK | 正常終了。 |
E_ID | 範囲外のメッセージバッファID番号。 |
E_PAR | パラメータエラー。 |
E_OBJ | 指定したメッセージバッファID番号は登録済み。 |
Ver3.0のメッセージバッファ生成情報構造体(T_CMBF)は以下のとおりです。
メンバ名 | 説明 |
---|---|
exinf | 拡張情報。 |
mbfatr |
メッセージバッファの属性。 タスクの待ち行列に格納する方式を指定します。
|
bufsz | メッセージバッファのサイズ。 |
maxmsz | メッセージの最大長。 |
Ver4.0のメッセージバッファ生成情報構造体(T_CMBF)は以下のとおりです。
メンバ名 | 説明 |
---|---|
mbfatr |
メッセージバッファの属性。 タスクの待ち行列に格納する方式を指定します。
|
maxmsz | メッセージの最大長。 |
mbfsz | メッセージバッファのサイズ。 |
mbf | メッセージバッファ領域のアドレス。 ※メッセージバッファ領域はライブラリ内で確保するので本ライブラリでは使用しません。 |
Ver3.0とVer4.0で構造体のメンバが異なるので、それぞれのサービスコールのエントリ関数内で構造体のメンバを取り出してから、メッセージバッファ生成処理を呼び出しています。
・Ver3.0のサービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief メッセージバッファの生成.
*
* @param [in] mbfid メッセージバッファID番号.
* @param [in] pk_cmbf メッセージバッファ生成情報構造体のポインタ.
*
* @retval エラーコード.
*/
ER cre_mbf( ID mbfid, const T_CMBF *pk_cmbf )
{
ER ercd;
WIMBFOBJ obj;
//! 引数が不正な場合はエラーにする.
if( !pk_cmbf ){
return E_PAR;
}
//! メッセージバッファ生成情報をコピーする.
memset( &obj, 0, sizeof(WIMBFOBJ) );
obj.SndAttr = pk_cmbf->mbfatr & ~TA_TPRI;
obj.RcvAttr = pk_cmbf->mbfatr;
obj.MsgSize = pk_cmbf->bufsz;
obj.MaxMsg = pk_cmbf->maxmsz;
obj.ExtInfo = pk_cmbf->exinf;
wi_CommonLock();
//! メッセージバッファを生成する.
ercd = wi_CreateMsgBuffer( mbfid, &obj );
wi_CommonUnlock();
return ercd;
}
・Ver4.0のサービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief メッセージバッファの生成.
*
* @param [in] mbfid メッセージバッファID番号.
* @param [in] pk_cmbf メッセージバッファ生成情報構造体のポインタ.
*
* @retval エラーコード.
*/
ER cre_mbf( ID mbfid, const T_CMBF *pk_cmbf )
{
ER ercd;
WIMBFOBJ obj;
//! 引数が不正な場合はエラーにする.
if( !pk_cmbf ){
return E_PAR;
}
//! メッセージバッファ生成情報をコピーする.
memset( &obj, 0, sizeof(WIMBFOBJ) );
obj.SndAttr = pk_cmbf->mbfatr;
obj.RcvAttr = pk_cmbf->mbfatr & ~TA_TPRI;
obj.MsgSize = pk_cmbf->mbfsz;
obj.MaxMsg = pk_cmbf->maxmsz;
wi_CommonLock();
//! メッセージバッファを生成する.
ercd = wi_CreateMsgBuffer( mbfid, &obj );
wi_CommonUnlock();
return ercd;
}
メッセージバッファID番号を自動割付けでメッセージバッファを生成する
メッセージバッファID番号を自動割付けでメッセージバッファを生成するには以下のサービスコールを使用します。
ER_ID acre_mbf( const T_CMBF *pk_cmbf )
引数 | 説明 |
---|---|
pk_cmbf | メッセージバッファ生成情報構造体のポインタ。 |
戻り値 | 説明 |
---|---|
E_PAR | パラメータエラー。 |
E_NOID | ID番号不足。 |
上記以外の正数 | 生成したメッセージバッファのID番号。(正常終了) |
・サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief メッセージバッファの生成 (ID番号自動割り付け).
*
* @param [in] pk_cmbf メッセージバッファ生成情報構造体のポインタ.
*
* @retval エラーコード.
*/
ER_ID acre_mbf( const T_CMBF *pk_cmbf )
{
ID mbfid;
ER ercd;
WIMBFOBJ obj;
//! 引数が不正な場合はエラーにする.
if( !pk_cmbf ){
return E_PAR;
}
//! メッセージバッファ生成情報をコピーする.
memset( &obj, 0, sizeof(WIMBFOBJ) );
obj.SndAttr = pk_cmbf->mbfatr;
obj.RcvAttr = pk_cmbf->mbfatr & ~TA_TPRI;
obj.MsgSize = pk_cmbf->mbfsz;
obj.MaxMsg = pk_cmbf->maxmsz;
wi_CommonLock();
for( mbfid = 1; mbfid < TMAX_MAXMBF; mbfid++ ){
//! メッセージバッファを生成する.
ercd = wi_CreateMsgBuffer( mbfid, &obj );
if( ercd == E_OK ){
ercd = mbfid;
break;
}
}
if( ercd == E_OBJ ){
ercd = E_NOID;
}
wi_CommonUnlock();
return ercd;
}
メッセージバッファID番号を自動割付けでメッセージバッファを生成する関数は以下のような処理を行います。
- cre_mbf()と同様に、サービスコールのエントリ関数内で引数の構造体のメンバをコピーし、メッセージバッファ生成関数を呼び出します。
- 生成するメッセージバッファのID番号を1~TMAX_MAXMBFに+1づつカウントアップして、空いているID番号を探してメッセージバッファを生成します。
- メッセージバッファが生成できた場合、戻り値を生成したメッセージバッファのID番号にして処理を終了します。
- 1~TMAX_MAXMBFの全てのID番号が使用中の場合、エラーコードが「E_OBJ(メッセージバッファ登録済み)」となるので、これを「E_NOID(ID番号不足)」に置き換えてエラー終了します。
メッセージバッファ生成関数
メッセージバッファ生成関数のソースコードは以下のとおりです。
/****************************************************************************/
/*!
* @brief メッセージバッファの生成.
*
* @param [in] id メッセージバッファID番号.
* @param [in] obj メッセージバッファ・オブジェクト構造体のポインタ.
*
* @retval エラーコード.
*/
ER wi_CreateMsgBuffer( INT id, const WIMBFOBJ *obj )
{
ER ercd;
WIMBFOBJ *p;
//! 不正な引数の場合はエラーにする.
if( obj->MaxMsg == 0 ){
return E_PAR;
}
//! メッセージバッファ・オブジェクトを作成する.
p = (WIMBFOBJ *)wi_CreateObject( id, TMAX_MAXMBF, sizeof(WIMBFOBJ), obj, ObjList, &ercd );
if( !p ){
return ercd;
}
//! メッセージバッファを確保する.
if( p->MsgSize > 0 ){
p->MsgBuf = (BYTE *)malloc( p->MsgSize );
if( !p->MsgBuf ){
SAFE_RELEASE( p );
return E_NOMEM;
}
//! 確保したメッセージバッファをクリアする.
memset( p->MsgBuf, 0, p->MsgSize );
}
p->GetPos = 0;
p->PutPos = 0;
//! リストにメッセージバッファを追加する.
wi_AddObject( (WIHDR *)p, &ObjList );
return E_OK;
}
メッセージバッファ生成関数は以下のような処理を行います。
- 確保するバッファのサイズが 0 の場合はエラーにします。
- 新しいメッセージバッファを生成します。
- メッセージを格納するバッファをmalloc()にて確保し、確保したバッファをクリアします。
- メッセージバッファ・リストに生成したメッセージバッファ・オブジェクトをリンクして処理を終了します。