Windows版 iTRONサービスコールの作成 (データキュー)
(その2)
データキューを生成するサービスコールは以下のとおりです。
サービスコール名 | 説明 |
---|---|
cre_dtq | データキューID番号を指定してデータキューを生成します。 |
acre_dtq | データキューID番号を自動割付けでデータキューを生成します。 |
データキューID番号を指定してデータキューを生成するには以下のサービスコールを使用します。
ER cre_dtq( ID dtqid, const T_CDTQ *pk_cdtq )
引数 | 説明 |
---|---|
dtqid | データキューID番号。 |
pk_cdtq | データキュー生成情報構造体のポインタ。 |
戻り値 | 説明 |
---|---|
E_OK | 正常終了。 |
E_ID | 範囲外のデータキューID番号。 |
E_PAR | パラメータエラー。 |
E_OBJ | 指定したデータキューID番号は登録済み。 |
データキュー生成情報構造体(T_CDTQ)は以下のとおりです。
メンバ名 | 説明 |
---|---|
dtqatr | データキューの属性。 |
dtqcnt | データキューに格納可能なデータ数。 |
dtq | データキュー領域の先頭アドレス。 ※データキュー領域はライブラリ内で確保するので本ライブラリでは使用しません。 |
サービスコールのエントリ関数内で構造体のメンバを取り出してから、データキュー生成処理を呼び出しています。
・サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief データキューの生成.
*
* @param [in] dtqid データキューID番号.
* @param [in] pk_cdtq データキュー生成情報構造体のポインタ.
*
* @retval エラーコード.
*/
ER cre_dtq( ID dtqid, const T_CDTQ *pk_cdtq )
{
ER ercd;
WIDTQOBJ obj;
//! 引数が不正な場合はエラーにする.
if( !pk_cdtq ){
return E_PAR;
}
//! データキュー生成情報をコピーする.
memset( &obj, 0, sizeof(WIDTQOBJ) );
obj.Attribute = pk_cdtq->dtqatr;
obj.QueSize = pk_cdtq->dtqcnt;
wi_CommonLock();
//! データキューを生成する.
ercd = wi_CreateDataQueue( (DWORD)dtqid, &obj );
wi_CommonUnlock();
return ercd;
}
データキューID番号を自動割付けでデータキューを生成するには以下のサービスコールを使用します。
ER_ID acre_dtq( const T_CDTQ *pk_cdtq )
引数 | 説明 |
---|---|
pk_cdtq | データキュー生成情報構造体のポインタ。 |
戻り値 | 説明 |
---|---|
E_PAR | パラメータエラー。 |
E_NOID | ID番号不足。 |
上記以外の正数 | 生成したデータキューのID番号。(正常終了) |
・サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief データキューの生成 (ID番号自動割り付け).
*
* @param [in] pk_cdtq データキュー生成情報構造体のポインタ.
*
* @retval 生成したデータキューのデータキューIDまたはエラーコード.
*/
ER_ID acre_dtq( const T_CDTQ *pk_cdtq )
{
ID dtqid;
ER ercd;
WIDTQOBJ obj;
//! 引数が不正な場合はエラーにする.
if( !pk_cdtq ){
return E_PAR;
}
//! データキュー生成情報をコピーする.
memset( &obj, 0, sizeof(WIDTQOBJ) );
obj.Attribute = pk_cdtq->dtqatr;
obj.QueSize = pk_cdtq->dtqcnt;
wi_CommonLock();
for( dtqid = 1; dtqid < TMAX_MAXDTQ; dtqid++ ){
//! データキューを生成する.
ercd = wi_CreateDataQueue( dtqid, &obj );
if( ercd == E_OK ){
ercd = dtqid;
break;
}
}
if( ercd == E_OBJ ){
ercd = E_NOID;
}
wi_CommonUnlock();
return ercd;
}
データキューID番号を自動割付けでデータキューを生成する関数は以下のような処理を行います。
- cre_dtq()と同様に、サービスコールのエントリ関数内で引数の構造体のメンバをコピーし、データキュー生成関数を呼び出します。
- 生成するデータキューのID番号を1~TMAX_MAXDTQに+1づつカウントアップして、空いているID番号を探してデータキューを生成します。
- データキューが生成できた場合、戻り値を生成したデータキューのID番号にして処理を終了します。
- 1~TMAX_MAXDTQの全てのID番号が使用中の場合、エラーコードが「E_OBJ(データキュー登録済み)」となるので、これを「E_NOID(ID番号不足)」に置き換えてエラー終了します。
データキュー生成関数
データキュー生成関数のソースコードは以下のとおりです。
/****************************************************************************/
/*!
* @brief データキューの生成.
*
* @param [in] id データキューID番号.
* @param [in] obj データキュー・オブジェクト構造体のポインタ.
*
* @retval エラーコード.
*/
ER wi_CreateDataQueue( INT id, const WIDTQOBJ *obj )
{
ER ercd;
WIDTQOBJ *p;
//! データキュー・オブジェクトを作成する.
p = (WIDTQOBJ *)wi_CreateObject( id, TMAX_MAXDTQ, sizeof(WIDTQOBJ), obj, ObjList, &ercd );
if( !p ){
return ercd;
}
if( p->QueSize > 0 ){
//! バッファFULL判定の為に1つ余計にバッファを確保する.
p->QueSize++;
//! データキューバッファを確保する.
p->QueBuf = (DWORD *)malloc( sizeof(DWORD) * p->QueSize );
if( !p->QueBuf ){
SAFE_RELEASE( p );
return E_NOMEM;
}
//! 確保したデータキューバッファをクリアする.
memset( p->QueBuf, 0, sizeof(DWORD) * p->QueSize );
}
p->GetPos = 0;
p->PutPos = 0;
//! リストにデータキューを追加する.
wi_AddObject( (WIHDR *)p, &ObjList );
return E_OK;
}
データキュー生成関数は以下のような処理を行います。
- 新しいデータキューを生成します。
- データキュー・バッファをmalloc()にて確保し、データキュー・バッファをクリアします。
- データキュー・リストに生成したデータキュー・オブジェクトをリンクして処理を終了します。