Windows版 iTRONサービスコールの作成 (データキュー)
(その2)

データキューを生成する

データキューを生成するサービスコールは以下のとおりです。


サービスコール名説明
cre_dtq

データキューID番号を指定してデータキューを生成します。

acre_dtq

データキューID番号を自動割付けでデータキューを生成します。

データキュー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番号を自動割付けでデータキューを生成する

データキュー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()にて確保し、データキュー・バッファをクリアします。
  • データキュー・リストに生成したデータキュー・オブジェクトをリンクして処理を終了します。


Windowsは米国Microsoft Corporationの登録商標です。