Windows版 iTRONサービスコールの作成 (メールボックス)
(その2)
メールボックスを生成するサービスコールは以下のとおりです。
サービスコール名 | 説明 |
---|---|
cre_mbx | メールボックスID番号を指定してメールボックスを生成します。 |
acre_mbx | メールボックスID番号を自動割付けでメールボックスを生成します。 |
※ acre_mbx()はVer4.0のみサポートされています。
メールボックスID番号を指定してメールボックスを生成するには以下のサービスコールを使用します。
Ver3.0とVer4.0では構造体のメンバが若干異なりますので注意してください。
ER cre_mbx( ID mbxid, const T_CMBX *pk_cmbx )
引数 | 説明 |
---|---|
mbxid | メールボックスID番号。 |
pk_cmbx | メールボックス生成情報構造体のポインタ。 |
戻り値 | 説明 |
---|---|
E_OK | 正常終了。 |
E_ID | 範囲外のメールボックスID番号。 |
E_PAR | パラメータエラー。 |
E_OBJ | 指定したメールボックスID番号は登録済み。 |
Ver3.0のメールボックス生成情報構造体(T_CMBX)は以下のとおりです。
メンバ名 | 説明 |
---|---|
exinf | 拡張情報。 |
mbxatr |
メールボックスの属性。 タスクの待ち行列に格納する方式を指定します。
メッセージキューに格納する方式を指定します。
|
Ver4.0のメールボックス生成情報構造体(T_CMBX)は以下のとおりです。
メンバ名 | 説明 |
---|---|
mbxatr |
メールボックスの属性。 タスクの待ち行列に格納する方式を指定します。
メッセージキューに格納する方式を指定します。
|
maxmpri | 送信されるメッセージ優先度の最大値。 |
mprihd | 優先度別のメッセージキューヘッダ領域のアドレス。 |
Ver3.0とVer4.0で構造体のメンバが異なるので、それぞれのサービスコールのエントリ関数内で構造体のメンバを取り出してから、メールボックス生成処理を呼び出しています。
・Ver3.0のサービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief メールボックスの生成.
*
* @param [in] mbxid メールボックスID番号.
* @param [in] pk_cmbx メールボックス生成情報構造体のポインタ.
*
* @retval エラーコード.
*/
ER cre_mbx( ID mbxid, const T_CMBX *pk_cmbx )
{
ER ercd;
WIMBXOBJ obj;
//! 引数が不正な場合はエラーにする.
if( !pk_cmbx ){
return E_PAR;
}
//! メールボックス生成情報をコピーする.
memset( &obj, 0, sizeof(WIMBXOBJ) );
obj.Attribute = pk_cmbx->mbxatr;
obj.ExtInfo = pk_cmbx->exinf;
obj->MaxPriority = TMAX_MPRI;
wi_CommonLock();
//! メールボックスを生成する.
ercd = wi_CreateMailBox( mbxid, &obj );
wi_CommonUnlock();
return ercd;
}
・Ver4.0のサービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief メールボックスの生成.
*
* @param [in] mbxid メールボックスID番号.
* @param [in] pk_cmbx メールボックス生成情報構造体のポインタ.
*
* @retval エラーコード.
*/
ER cre_mbx( ID mbxid, const T_CMBX *pk_cmbx )
{
ER ercd;
WIMBXOBJ obj;
//! 引数が不正な場合はエラーにする.
if( !pk_cmbx ){
return E_PAR;
}
//! メールボックス生成情報をコピーする.
memset( &obj, 0, sizeof(WIMBXOBJ) );
obj.Attribute = pk_cmbx->mbxatr;
obj.MaxPriority = pk_cmbx->maxmpri;
wi_CommonLock();
//! メールボックスを生成する.
ercd = wi_CreateMailBox( mbxid, &obj );
wi_CommonUnlock();
return ercd;
}
メールボックスID番号を自動割付けでメールボックスを生成する (Ver4.0のみ)
メールボックスID番号を自動割付けでメールボックスを生成するには以下のサービスコールを使用します。
ER acre_mbx( const T_CMBX *pk_cmbx )
引数 | 説明 |
---|---|
pk_cmbx | メールボックス生成情報構造体のポインタ。 |
戻り値 | 説明 |
---|---|
E_PAR | パラメータエラー。 |
E_NOID | ID番号不足。 |
上記以外の正数 | 生成したメールボックスのID番号。(正常終了) |
・サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief メールボックスの生成 (ID番号自動割り付け).
*
* @param [in] pk_cmbx メールボックス生成情報構造体のポインタ.
*
* @retval 生成したメールボックスのメールボックスIDまたはエラーコード.
*/
ER_ID acre_mbx( const T_CMBX *pk_cmbx )
{
ID mbxid;
ER ercd;
WIMBXOBJ obj;
//! 引数が不正な場合はエラーにする.
if( !pk_cmbx ){
return E_PAR;
}
//! メールボックス生成情報をコピーする.
memset( &obj, 0, sizeof(WIMBXOBJ) );
obj.Attribute = pk_cmbx->mbxatr;
obj.MaxPriority = pk_cmbx->maxmpri;
wi_CommonLock();
for( mbxid = 1; mbxid < TMAX_MAXMBX; mbxid++ ){
//! メールボックスを生成する.
ercd = wi_CreateMailBox( mbxid, &obj );
if( ercd == E_OK ){
ercd = mbxid;
break;
}
}
if( ercd == E_OBJ ){
ercd = E_NOID;
}
wi_CommonUnlock();
return ercd;
}
メールボックスID番号を自動割付けでメールボックスを生成する関数は以下のような処理を行います。
- cre_mbx()と同様に、サービスコールのエントリ関数内で引数の構造体のメンバをコピーし、メールボックス生成関数を呼び出します。
- 生成するメールボックスのID番号を1~TMAX_MAXMBXに+1づつカウントアップして、空いているID番号を探してメールボックスを生成します。
- メールボックスが生成できた場合、戻り値を生成したメールボックスのID番号にして処理を終了します。
- 1~TMAX_MAXMBXの全てのID番号が使用中の場合、エラーコードが「E_OBJ(メールボックス登録済み)」となるので、これを「E_NOID(ID番号不足)」に置き換えてエラー終了します。
メールボックス生成関数
メールボックス生成関数のソースコードは以下のとおりです。
/****************************************************************************/
/*!
* @brief メールボックスの生成.
*
* @param [in] id メールボックスID番号.
* @param [in] obj メールボックス・オブジェクト構造体のポインタ.
*
* @retval エラーコード.
*/
ER wi_CreateMailBox( INT id, const WIMBXOBJ *obj )
{
ER ercd;
WIMBXOBJ *p;
//! 不正な引数の場合はエラーにする.
if( (obj->Attribute & TA_MPRI) != 0 && (obj->MaxPriority == 0 || obj->MaxPriority > TMAX_MPRI) ){
return E_PAR;
}
//! メールボックス・オブジェクトを作成する.
p = (WIMBXOBJ *)wi_CreateObject( id, TMAX_MAXMBX, sizeof(WIMBXOBJ), obj, ObjList, &ercd );
if( !p ){
return ercd;
}
//! リストにメールボックスを追加する.
wi_AddObject( (WIHDR *)p, &ObjList );
return E_OK;
}
メールボックス生成関数は以下のような処理を行います。
- メッセージのキューイング方式がメッセージ優先度の最大値が 0 または TMAX_MPRI より大きい場合はエラーにします。
- 新しいメールボックスを生成します。
- メールボックス・リストに生成したメールボックス・オブジェクトをリンクして処理を終了します。