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番号を取り出して、引数の構造体にセットします。