入力転送時のバッファ使用方法について

ここでは、入力転送(サンプリング)を行なう上での代表的なパターンにおけるバッファと関数の使用方法について説明します。


■パターン1:有限データ数、データをサンプリング後に取得


1回転送を行ない、データをサンプリング終了後に取得する場合です。

syori.png(440 byte)
                      処理
この場合、バッファサイズは欲しいデータ数のサイズ以上用意する必要があります。
バッファの繰り返し指定は、DIODM_WRITE_ONCEを指定します。
データ入力個数が決まっている場合には、ストップ条件をDIODM_STOP_NUMに指定して、
DioDmSetStopNum関数で指定個数で転送を完了するようにしてください。

転送を開始した後は、完了メッセージを待つか、
またはステータス取得関数でステータスビットDIODM_STATUS_BMSTOPが立つまで、
nanosleepなどでウェイトを入れながらループで待ちます。


■パターン2:有限データ数、データをサンプリングしながら取得


 1回転送を行ない、データをサンプリング中に取得して、使用する場合です。
syori.png(440 byte)
  処理      処理      処理
この場合、バッファサイズは欲しいデータ数のサイズ以上用意する必要があります。
バッファの繰り返し指定は、DIODM_WRITE_ONCEを指定します。
データ入力個数が決まっている場合には、ストップ条件をDIODM_STOP_NUMに指定して、
DioDmSetStopNum関数で指定個数で転送を完了するようにしてください。

転送中は、転送個数取得関数(DioDmGetCount)でデータの入っている
位置を確かめながら、処理を行ないます。

途中でステータス関数でのチェックを行なって、エラーなどで終了していないかを
確認しながら処理を行なってください。
システムに負荷を掛けないためには、ループ中でnanosleepなどでウェイトを入れてください。


■パターン3:無限データ数、全てのデータを取得


 無限転送を行ない、一定個数データを取得したら、ファイルにデータを格納するなどの
処理を行なう場合です。
syori.png(440 byte)
  処理      処理      処理
転送個数の確認は、指定個数転送完了メッセージを使用するか、システムタイマ等で
転送個数取得関数を使用して行ないます。
アプリケーションはリードポインタからライトポインタまで処理の処理をシステムタイマまたは
イベントメッセージにより周期的に行ないます。

この場合注意しなければならないのは、どこまでデータを処理したのかを示すリードポインタと、
バッファのどこまでデータが書かれているかを示すライトポインタをユーザープログラムで
管理しなければならない点です。

リードポインタ/ライトポインタは、バッファサイズまで転送すると、折り返して0に戻るカウンタです。
ライトポインタは、(DioDmGetWritePointerUserBuf)を使用して求めます。
リードポインタは、前回データ処理時のライトポインタです。


■パターン4:無限データ数、ライトポインタを取得して、任意の箇所から任意のデータ数を取得


 無限転送を行ない、ある任意の条件が成立したら任意の箇所から任意のデータ数を取得するという場合です。
この場合も、リードポインタとライトポインタの管理が必要になります。 パターン3を参考にしてください。