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

データキューの状態を参照する

データキューの状態を参照するサービスコールは以下のとおりです。


サービスコール名説明
ref_dtq

データキューの状態を取得します。

データキューの状態を取得する

データキューの状態を取得するには以下のサービスコールを使用します。



    ER ref_dtq( ID dtqid, T_RDTQ *pk_rdtq )
	

引数説明
dtqid

データキューID番号。

pk_rdtq

データキュー状態を格納する構造体のポインタ。

戻り値説明
E_OK

正常終了。

E_ID

範囲外のデータキューID番号。

E_NOEXS

指定したデータキューID番号は登録されていない。

E_PAR

パラメータエラー。


データキュー状態を格納する構造体(T_RDTQ)は以下のとおりです。

メンバ名説明
stskid

データキューの送信待ち行列の先頭のタスクのID番号。

rtskid

データキューの受信待ち行列の先頭のタスクのID番号。

sdtqcnt

データキューに入っているデータ数。


・サービスコールのソースコードは以下のようになります。


/****************************************************************************/
/*!
 *  @brief  データキューの状態参照.
 *
 *  @param  [in]    dtqid   データキューID番号.
 *  @param  [out]   pk_rdtq データキュー状態を格納する構造体のポインタ.
 *
 *  @retval エラーコード.
 */
ER      ref_dtq( ID dtqid, T_RDTQ *pk_rdtq )
{
    ER          ercd;
    WIDTQSTAT   sts;

    //! 引数が不正な場合はエラーにする.
    if( !pk_rdtq ){
        return E_PAR;
    }
    wi_CommonLock();

    //! データキューの状態を取得する.
    ercd = wi_RefarenceDataQueue( dtqid, &sts );
    if( ercd == E_OK ){
        pk_rdtq->stskid  = sts.SndWaitId;
        pk_rdtq->rtskid  = sts.RcvWaitId;
        pk_rdtq->sdtqcnt = sts.DataCnt;
    }
    wi_CommonUnlock();
    return ercd;
}
	

データキュー状態を格納する構造体のポインタがNULLの場合エラーにします。

データキュー状態を取得する関数を呼び出して現在のデータキューの状態を取得し引数の構造体に格納します。

データキュー状態取得関数

データキュー状態を取得する関数のソースコードは以下のとおりです。



/****************************************************************************/
/*!
 *  @brief  データキューの状態参照.
 *
 *  @param  [in]    id      データキューID番号.
 *  @param  [out]   sts     データキュー状態を格納する構造体のポインタ.
 *
 *  @retval エラーコード.
 */
ER      wi_RefarenceDataQueue( INT id, WIDTQSTAT *sts )
{
    ER          ercd;
    WIDTQOBJ    *p;
    DWORD       cnt;

    //! データキューIDのオブジェクトを取得する.
    p = (WIDTQOBJ *)wi_FindObject( id, TMAX_MAXDTQ, ObjList, &ercd );
    if( !p ){
        return ercd;
    }
    //! データキューに入っているデータの個数を計算する.
    if( p->GetPos <= p->PutPos ){
        cnt = p->PutPos - p->GetPos;
    }else{
        cnt = (p->QueSize + p->PutPos) - p->GetPos;
    }
    //! データキューの状態を構造体にセットする.
    sts->SndWaitId = wi_GetWaitTaskListFirstId( p->SndWaitQue );
    sts->RcvWaitId = wi_GetWaitTaskListFirstId( p->RcvWaitQue );
    sts->DataCnt   = cnt;
    return E_OK;
}
	

データキューの状態を取得する関数は以下のような処理を行います。

  • 引数で指定されたデータキューID番号に該当するデータキュー・オブジェクトを取り出します。
  • データキューに入っているデータの個数を計算して、引数の構造体にセットします。
  • データ送信待ち行列から先頭のタスクのID番号を取り出して、引数の構造体にセットします。
  • データ受信待ち行列から先頭のタスクのID番号を取り出して、引数の構造体にセットします。


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