Windows版 iTRONサービスコールの作成 (データキュー)
(その5)
データキューにデータを強制送信するサービスコールは以下のとおりです。
サービスコール名 | 説明 |
---|---|
fsnd_dtq | データキューにデータを強制送信します。 |
ifsnd_dtq | データキューにデータを強制送信します。(非タスクコンテキストからの呼出し) |
データキューにデータを強制的に格納するには以下のサービスコールを使用します。
ER fsnd_dtq( ID dtqid, VP_INT data )
引数 | 説明 |
---|---|
dtqid | データキューID番号。 |
data | データキューに格納するデータ。 |
戻り値 | 説明 |
---|---|
E_OK | 正常終了。 |
E_ID | 範囲外のデータキューID番号。 |
E_NOEXS | 指定したデータキューID番号は登録されていない。 |
割り込みハンドラや周期起動ハンドラ等の非タスク処理内からの呼び出しは、fsnd_dtq()ではなく、ifsnd_dtq()を使用します。
ER ifsnd_dtq( ID dtqid, VP_INT data )
引数および戻り値は fsnd_dtq() と同じです。
・fsnd_dtq() サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief データキューへ強制送信.
*
* @param [in] dtqid データキューID番号.
* @param [in] data データキューに送信するデータ.
*
* @retval エラーコード.
*/
ER fsnd_dtq( ID dtqid, VP_INT data )
{
ER ercd;
wi_CommonLock();
//! データキューへデータを強制送信する.
ercd = wi_ForceSendDataQueue( dtqid, (DWORD)data );
wi_CommonUnlock();
return ercd;
}
データキューID番号とデータキューに格納するデータを引数としてfsnd_dtqを呼び出します。
・ifsnd_dtq() サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief データキューへ強制送信 (非タスクコンテキストからの呼出し用).
*
* @param [in] dtqid データキューID番号.
* @param [in] data データキューに送信するデータ.
*
* @retval エラーコード.
*/
ER ifsnd_dtq( ID dtqid, VP_INT data )
{
//! データキューへデータを強制送信する.
return fsnd_dtq( dtqid, data );
}
fsnd_dtq()を改めて呼び出すだけですので、fsnd_dtq()と同じ動作になります。
データキューへの強制送信関数
fsnd_dtq()、ifsnd_dtq() で使用するデータキューへの強制送信関数のソースコードは以下のとおりです。
/****************************************************************************/
/*!
* @brief データキューへの強制送信.
*
* @param [in] id データキューID番号.
* @param [in] data データキューに送信するデータ.
*
* @retval エラーコード.
*/
ER wi_ForceSendDataQueue( INT id, DWORD data )
{
ER ercd;
WIDTQOBJ *p;
DWORD pos;
//! データキューIDのオブジェクトを取得する.
p = (WIDTQOBJ *)wi_FindObject( id, TMAX_MAXDTQ, ObjList, &ercd );
if( !p ){
return ercd;
}
//! データキューバッファを確保していない場合はエラーにする.
if( p->QueSize == 0 ){
return E_ILUSE;
}
//! データキューに空きがない場合はデータキューの先頭データを廃棄する.
pos = wi_IncRingPositon( p->PutPos, p->QueSize );
if( pos == p->GetPos ){
p->GetPos = wi_IncRingPositon( p->GetPos, p->QueSize );
}
//! データキューのデータ送信処理を呼び出す.
return wi_SendDataQueue( id, data, TMO_POL );
}
データキューへの強制送信関数は以下のような処理を行います。
- 引数で指定されたデータキューID番号に該当するデータキュー・オブジェクトを取り出します。
- データキューのバッファを確保していない場合はエラーで終了します。
- データキューのバッファに空きがない場合、バッファの先頭のデータを読み捨てます。
- 強制送信の場合、送信待ちは行わないので、ポーリング方式でデータキューのデータ送信処理を呼び出します。