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番号に該当するデータキュー・オブジェクトを取り出します。
  • データキューのバッファを確保していない場合はエラーで終了します。
  • データキューのバッファに空きがない場合、バッファの先頭のデータを読み捨てます。
  • 強制送信の場合、送信待ちは行わないので、ポーリング方式でデータキューのデータ送信処理を呼び出します。


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