Windows版 iTRONサービスコールの作成 (ランデブポート)
(その2)
ランデブポートを生成するサービスコールは以下のとおりです。
サービスコール名 | 説明 |
---|---|
cre_por | ランデブポートID番号を指定してランデブポートを生成します。 |
acre_por | ランデブポートID番号を自動割付けでランデブポートを生成します。 |
※ acre_por()はVer4.0のみサポートされています。
ランデブポートID番号を指定してランデブポートを生成するには以下のサービスコールを使用します。
ER cre_por( ID porid, const T_CPOR *pk_cpor )
引数 | 説明 |
---|---|
porid | ランデブポートID番号。 |
pk_cpor | ランデブポート生成情報構造体のポインタ。 |
戻り値 | 説明 |
---|---|
E_OK | 正常終了。 |
E_ID | 範囲外のランデブポートID番号。 |
E_PAR | パラメータエラー。 |
E_OBJ | 指定したランデブポートID番号は登録済み。 |
Ver3.0のランデブポート生成情報構造体(T_CPOR)は以下のとおりです。
メンバ名 | 説明 |
---|---|
exinf | 拡張情報。 |
poratr |
ランデブポートの属性。 タスクの待ち行列に格納する方式を指定します。
|
maxcmsz | ランデブ呼出時のメッセージの最大長。 |
maxrmsz | ランデブ返答時のメッセージの最大長。 |
Ver4.0のランデブポート生成情報構造体(T_CPOR)は以下のとおりです。
メンバ名 | 説明 |
---|---|
poratr |
ランデブポートの属性。 タスクの待ち行列に格納する方式を指定します。
|
maxcmsz | ランデブ呼出時のメッセージの最大長。 |
maxrmsz | ランデブ返答時のメッセージの最大長。 |
Ver3.0とVer4.0で構造体のメンバが異なるので、それぞれのサービスコールのエントリ関数内で構造体のメンバを取り出してから、ランデブポート生成処理を呼び出しています。
・Ver3.0のサービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief ランデブポートの生成.
*
* @param [in] porid ランデブポートID番号.
* @param [in] pk_cpor ランデブポート生成情報構造体のポインタ.
*
* @retval エラーコード.
*/
ER cre_por( ID porid, const T_CPOR *pk_cpor )
{
ER ercd;
WIPOROBJ obj;
//! 引数が不正な場合はエラーにする.
if( !pk_cpor ){
return E_PAR;
}
//! ランデブポート生成情報をコピーする.
memset( &obj, 0, sizeof(WIPOROBJ) );
obj.Attribute = pk_cpor->poratr;
obj.MaxCalMsg = pk_cpor->maxcmsz;
obj.MaxRepMsg = pk_cpor->maxrmsz;
obj.ExtInfo = pk_cpor->exinf;
wi_CommonLock();
//! ランデブポートを生成する.
ercd = wi_CreateRendPort( porid, &obj );
wi_CommonUnlock();
return ercd;
}
・Ver4.0のサービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief ランデブポートの生成.
*
* @param [in] porid ランデブポートID番号.
* @param [in] pk_cpor ランデブポート生成情報構造体のポインタ.
*
* @retval エラーコード.
*/
ER cre_por( ID porid, const T_CPOR *pk_cpor )
{
ER ercd;
WIPOROBJ obj;
//! 引数が不正な場合はエラーにする.
if( !pk_cpor ){
return E_PAR;
}
//! ランデブポート生成情報をコピーする.
memset( &obj, 0, sizeof(WIPOROBJ) );
obj.Attribute = pk_cpor->poratr;
obj.MaxCalMsg = pk_cpor->maxcmsz;
obj.MaxRepMsg = pk_cpor->maxrmsz;
wi_CommonLock();
//! ランデブポートを生成する.
ercd = wi_CreateRendPort( porid, &obj );
wi_CommonUnlock();
return ercd;
}
ランデブポートID番号を自動割付けでランデブポートを生成する
ランデブポートID番号を自動割付けでランデブポートを生成するには以下のサービスコールを使用します。
ER_ID acre_por( const T_CPOR *pk_cpor )
引数 | 説明 |
---|---|
pk_cpor | ランデブポート生成情報構造体のポインタ。 |
戻り値 | 説明 |
---|---|
E_PAR | パラメータエラー。 |
E_NOID | ID番号不足。 |
上記以外の正数 | 生成したメッセージバッファのID番号。(正常終了) |
・サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief ランデブポートの生成 (ID番号自動割り付け).
*
* @param [in] pk_cpor ランデブポート生成情報構造体のポインタ.
*
* @retval エラーコード.
*/
ER_ID acre_por( const T_CPOR *pk_cpor )
{
ID porid;
ER ercd;
WIPOROBJ obj;
//! 引数が不正な場合はエラーにする.
if( !pk_cpor ){
return E_PAR;
}
//! ランデブポート生成情報をコピーする.
memset( &obj, 0, sizeof(WIPOROBJ) );
obj.Attribute = pk_cpor->poratr;
obj.MaxCalMsg = pk_cpor->maxcmsz;
obj.MaxRepMsg = pk_cpor->maxrmsz;
wi_CommonLock();
for( porid = 1; porid < TMAX_MAXPOR; porid++ ){
//! ランデブポートを生成する.
ercd = wi_CreateRendPort( porid, &obj );
if( ercd == E_OK ){
ercd = porid;
break;
}
}
if( ercd == E_OBJ ){
ercd = E_NOID;
}
wi_CommonUnlock();
return ercd;
}
ランデブポートID番号を自動割付けでランデブポートを生成する関数は以下のような処理を行います。
- cre_por()と同様に、サービスコールのエントリ関数内で引数の構造体のメンバをコピーし、ランデブポート生成関数を呼び出します。
- 生成するランデブポートのID番号を1~TMAX_MAXPORに+1づつカウントアップして、空いているID番号を探してランデブポートを生成します。
- ランデブポートが生成できた場合、戻り値を生成したランデブポートのID番号にして処理を終了します。
- 1~TMAX_MAXPORの全てのID番号が使用中の場合、エラーコードが「E_OBJ(ランデブポート登録済み)」となるので、これを「E_NOID(ID番号不足)」に置き換えてエラー終了します。
ランデブポート生成関数
ランデブポート生成関数のソースコードは以下のとおりです。
/****************************************************************************/
/*!
* @brief ランデブポートの生成.
*
* @param [in] id ランデブ・ポートID番号.
* @param [in] obj ランデブ・オブジェクト構造体のポインタ.
*
* @retval エラーコード.
*/
ER wi_CreateRendPort( INT id, const WIPOROBJ *obj )
{
ER ercd;
WIPOROBJ *p;
//! 不正な引数の場合はエラーにする.
if( obj->MaxCalMsg == 0 || obj->MaxRepMsg == 0 ){
return E_PAR;
}
//! ランデブポート・オブジェクトを作成する.
p = (WIPOROBJ *)wi_CreateObject( id, TMAX_MAXPOR, sizeof(WIPOROBJ), obj, PortList, &ercd );
if( !p ){
return ercd;
}
//! リストにランデブポートを追加する.
wi_AddObject( (WIHDR *)p, &PortList );
return E_OK;
}
ランデブポート生成関数は以下のような処理を行います。
- 呼び出しまたは受け付けメッセージの最大サイズが 0 の場合はエラーにします。
- 新しいランデブポートを生成します。
- ランデブポート・リストに生成したランデブポート・オブジェクトをリンクして処理を終了します。