Windows版 iTRONサービスコールの作成 (メッセージバッファ)
(その6)
メッセージバッファの状態を参照するサービスコールは以下のとおりです。
サービスコール名 | 説明 |
---|---|
ref_mbf | メッセージバッファの状態を取得します。 |
Ver3.0と4.0では関数名は同じですが、引数の順番が逆になりますので注意してください。
Ver3.0でメッセージバッファの状態を取得するには以下のサービスコールを使用します。
ER ref_mbf( T_RMBF *pk_rmbf, ID mbfid )
引数 | 説明 |
---|---|
pk_rmbf | メッセージバッファ状態を格納する構造体のポインタ。 |
mbfid | メッセージバッファID番号。 |
戻り値 | 説明 |
---|---|
E_OK | 正常終了。 |
E_ID | 範囲外のメッセージバッファID番号。 |
E_NOEXS | 指定メッセージバッファID番号は登録されていない。 |
E_PAR | パラメータエラー。 |
メッセージバッファ状態を格納する構造体(T_RMBF)は以下のとおりです。
メンバ名 | 説明 |
---|---|
exinf | 拡張情報。 |
wtsk | 受信待ちタスクの有無。 |
wtsk | 送信待ちタスクの有無。 |
msgsz | 次に受信されるメッセージのサイズ。 |
msgsz | 空きバッファのサイズ。 |
・サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief メッセージバッファの状態参照.
*
* @param [out] pk_rmbf メッセージバッファ状態を格納する構造体のポインタ.
* @param [in] mbfid メッセージバッファID番号.
*
* @retval エラーコード.
*/
ER ref_mbf( T_RMBF *pk_rmbf, ID mbfid )
{
ER ercd;
WIMBFSTAT sts;
//! 引数が不正な場合はエラーにする.
if( !pk_rmbf ){
return E_PAR;
}
wi_CommonLock();
//! メッセージバッファの状態を取得する.
ercd = wi_RefarenceMsgBuffer( mbfid, &sts );
if( ercd == E_OK ){
pk_rmbf->exinf = sts.ExtInfo;
pk_rmbf->wtsk = (BOOL_ID)sts.RcvWaitId;
pk_rmbf->stsk = (BOOL_ID)sts.SndWaitId;
pk_rmbf->msgsz = sts.MsgSize;
pk_rmbf->frbufsz = sts.FreeSize;
}
wi_CommonUnlock();
return ercd;
}
メッセージバッファ状態を格納する構造体のポインタがNULLの場合エラーにします。
メッセージバッファ状態を取得する関数を呼び出して現在のメッセージバッファの状態を取得し引数の構造体に格納します。
メッセージバッファの状態を取得する (Ver4.0)
Ver4.0でメッセージバッファの状態を取得するには以下のサービスコールを使用します。
ER ref_mbf( ID mbfid, T_RMBF *pk_rmbf )
引数 | 説明 |
---|---|
mbfid | メッセージバッファID番号。 |
pk_rmbf | メッセージバッファ状態を格納する構造体のポインタ。 |
戻り値 | 説明 |
---|---|
E_OK | 正常終了。 |
E_ID | 範囲外のメッセージバッファID番号。 |
E_NOEXS | 指定したメッセージバッファID番号は登録されていない。 |
E_PAR | パラメータエラー。 |
メッセージバッファ状態を格納する構造体(T_RMBF)は以下のとおりです。
メンバ名 | 説明 |
---|---|
stskid | メッセージバッファの送信待ち行列の先頭のタスクのID番号。 |
rtskid | メッセージバッファの受信待ち行列の先頭のタスクのID番号。 |
smsgcnt | メッセージバッファに入っているメッセージの数。 |
fmbfsz | メッセージバッファの空き領域のサイズ。 |
・サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief メッセージバッファの状態参照.
*
* @param [in] mbfid メッセージバッファID番号.
* @param [out] pk_rmbf メッセージバッファ状態を格納する構造体のポインタ.
*
* @retval エラーコード.
*/
ER ref_mbf( ID mbfid, T_RMBF *pk_rmbf )
{
ER ercd;
WIMBFSTAT sts;
//! 引数が不正な場合はエラーにする.
if( !pk_rmbf ){
return E_PAR;
}
wi_CommonLock();
//! メッセージバッファの状態を取得する.
ercd = wi_RefarenceMsgBuffer( mbfid, &sts );
if( ercd == E_OK ){
pk_rmbf->rtskid = sts.RcvWaitId;
pk_rmbf->stskid = sts.SndWaitId;
pk_rmbf->smsgcnt = sts.MsgSize;
pk_rmbf->fmbfsz = sts.FreeSize;
}
wi_CommonUnlock();
return ercd;
}
メッセージバッファ状態を格納する構造体のポインタがNULLの場合エラーにします。
メッセージバッファ状態を取得する関数を呼び出して現在のメッセージバッファの状態を取得し引数の構造体に格納します。
メッセージバッファ状態取得関数
メッセージバッファ状態を取得する関数のソースコードは以下のとおりです。
/****************************************************************************/
/*!
* @brief メッセージバッファの状態参照.
*
* @param [in] id メッセージバッファID番号.
* @param [out] sts メッセージバッファ状態を格納する構造体のポインタ.
*
* @retval エラーコード.
*/
ER wi_RefarenceMsgBuffer( INT id, WIMBFSTAT *sts )
{
ER ercd;
WIMBFOBJ *p;
//! メッセージバッファIDのオブジェクトを取得する.
p = (WIMBFOBJ *)wi_FindObject( id, TMAX_MAXMBF, ObjList, &ercd );
if( !p ){
return ercd;
}
//! メッセージバッファの状態を構造体にセットする.
sts->SndWaitId = wi_GetWaitTaskListFirstId( p->SndWaitQue );
sts->RcvWaitId = wi_GetWaitTaskListFirstId( p->RcvWaitQue );
sts->MsgSize = GetNextMessageSize( p );
sts->FreeSize = GetFreeSize( p );
sts->ExtInfo = p->ExtInfo;
return E_OK;
}
メッセージバッファ状態を取得する関数は以下のような処理を行います。
- 引数で指定されたメッセージバッファID番号に該当するメッセージバッファ・オブジェクトを取り出します。
- メッセージ送信待ち行列から先頭のタスクのID番号を取り出して、引数の構造体にセットします。
- メッセージ受信待ち行列から先頭のタスクのID番号を取り出して、引数の構造体にセットします。
- メッセージバッファの先頭にあるメッセージのバイト数を取り出して、引数の構造体にセットします。
- メッセージバッファの空きバッファのサイズを計算して、引数の構造体にセットします。
- cre_mbf()でメッセージバッファを生成するときに渡された拡張情報を引数の構造体にセットします。(Ver4.0の場合は常に0を返します。)