C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: 高速 1ms ReadFile


(過去ログ 107 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■63806 / inTopicNo.1)  高速 1ms ReadFile
  
□投稿者/ kappa (1回)-(2012/10/12(Fri) 18:35:05)

分類:[VB.NET/VB2005 以降] 

VisualStudio 2010 ExpressにてHIDに対応したUSBデバイスから1ms毎に送られてくるデータを取得しようとしております。

Do While BlnIsLoop=True
  ReadFile(HidHandle, BufBytes, InputReportByteLength, ref BytesRead, OVERLAPPED )
  Array.Copy(BufBytes, 0, OutBytes, offset, 64)
Loop

のような形で
USBデバイスからは、1ms毎に64bytesのデータが送られてきており、必要なデータが取得できたらLoopを抜けるようにしています。
Loopの回数は、今のところ200程度です。
Loopを抜けてから埋まっている取得した配列をチェックし正しく受信できていないデータは、無視するようにしています。
データの中身には0ffsetが含まれており、offsetを確認すると10回に1度必要なデータが抜けているのが確認されています。
データが抜けているときは、Errorが発生しておりますので、データ取得に間に合っていないか?逆に早いかだと思われます。

データが抜けていたときにUSBのプロトコルアナライザーでは、ただしく送られてきておりますので、PC側で取りこぼしています。
受信に関しては、上述ReadFileで取得しているだけです。

考え方として
@データを受け取ったなにがしらイベントを取得してReadFileをするか?
A正確に時間を取得して(1ms以下の精度で)1ms毎にReadFileされるようにする
しかないように思われます。
そこで質問は、
1ms毎にデータを取りこぼしなく取得するには、どのようにすればいいのか教えていただきたくよろしくお願いいたします。
質問内容が漠然としているので申し訳ありません。
上述@やAのコードの記述の仕方がわからないためキーワード等を教えていただけましたら
調べて試してみたいと思います。




引用返信 編集キー/
■63808 / inTopicNo.2)  Re[1]: 高速 1ms ReadFile
□投稿者/ 774RR (5回)-(2012/10/12(Fri) 19:34:11)
その提示コード、まさか UI スレッド内部で使っていたりしないよね・・・

ウチで HID 作った時の経験から言うと
・ kernel レベル (ring 0) では取りこぼしていない
・アプリケーションレベル (ring 3) では取りこぼしているように見えることがある、が
・それは ReadFile を呼ぶ間隔が長すぎ=処理が間に合っていないだけ。
 アプリケーションレベルでのタイムスライス割り当てが USB Interrupt Interval より長い
=一度処理権限を他に手渡すと、再度戻ってくるまでに HID の転送は(何回か)終わっている。
ということらしい。

一般的なアプリケーションの UI スレッドレベルで 1msec の応答速度を確保するのは
困難というか、事実上不可能だと思うぞ。

ウチで行った処理は以下のとおり。
・入力(入出力?)専用スレッドを THREAD_PRIORITY_TIME_CRITICAL で作る
 まかりまちがっても UI スレッドの PRIORITY を上げてはならない。
・そのスレッド内から同期操作 ReadFile を使う (OVERLAPPED を使わない)
・すると Interrupt Interval にほぼ一致する間隔で ReadFile から処理が帰る
・入力スレッドは、受信データをキューにがんがん蓄積していくだけ

ウチで作った HID は 4msec interval だったからあまり参考にならないかも・・・
引用返信 編集キー/
■63809 / inTopicNo.3)  Re[2]: 高速 1ms ReadFile
□投稿者/ kappa (2回)-(2012/10/12(Fri) 20:07:32)
No63808 (774RR さん) に返信
774RR さん返信いただきありがとうございます。


> その提示コード、まさか UI スレッド内部で使っていたりしないよね・・・
UIスレッドとは簡単に教えていただけないでしょうか?

マルチスレッド(専用スレッド)にはしておらず、あるトリガーで普通に記述しております。
それが、UIスレッド内部では?という意味であれば、
UIスレッド内部で使用していることになります。


> 一般的なアプリケーションの UI スレッドレベルで 1msec の応答速度を確保するのは
> 困難というか、事実上不可能だと思うぞ。
そうですよね。
勉強もかねてやっているだけに何か手はないかと考えているところです。
といってもそれを乗り越えられるだけの知識がないのがつらいところですが、、、


> ウチで行った処理は以下のとおり。
> ・入力(入出力?)専用スレッドを THREAD_PRIORITY_TIME_CRITICAL で作る
>  まかりまちがっても UI スレッドの PRIORITY を上げてはならない。
> ・そのスレッド内から同期操作 ReadFile を使う (OVERLAPPED を使わない)
> ・すると Interrupt Interval にほぼ一致する間隔で ReadFile から処理が帰る
> ・入力スレッドは、受信データをキューにがんがん蓄積していくだけ
>
> ウチで作った HID は 4msec interval だったからあまり参考にならないかも・・・

参考になる記述等あれば、URL等、ご教授いただけるとたすかります。
専用スレッドでもTryしようとは思っていたのですが、、、
まずは、やってみたいと思います。
引用返信 編集キー/
■63814 / inTopicNo.4)  Re[3]: 高速 1ms ReadFile
□投稿者/ オショウ (30回)-(2012/10/13(Sat) 03:17:35)
本来、1msは、デバイスドライバーのレベルの話・・・

タイマーを持ったボードを使って、ハードウェア割り込みを
0.2msくらいで発生させてポーリング受信させるのが適当かと
思いますが・・・

以上。参考まで
引用返信 編集キー/
■63815 / inTopicNo.5)  Re[4]: 高速 1ms ReadFile
□投稿者/ 774RR (6回)-(2012/10/13(Sat) 14:55:38)
UIスレッドが何かは windows programming の基本なので適宜勉強してくれ。
簡単に言うと
・画面上のボタンを押した、など「操作」に対して、
・文字を表示するとか HID からデータを読むとか、「対応した動作」を行う
などの、通常の「ユーザー操作に答える」のがUIスレッドの仕事。だから

> あるトリガーで普通に記述しております
そのトリガーが「通信する」ボタンのハンドラの中、ということなら、
それはほぼ間違いなくUIスレッド内に書かれた処理だ。

俺は HID を作る方面(回路+ノイズ対策+デバイスマイコンのファーム)であれば
経験があるのでこうやってしゃしゃり出てるし、
VC++ ならいくらでもサンプル書いてあげられるけど
VB は素人なので具体的にどう書く?ってのは他の人にお任せ。
http://jeanne.wankuma.com
http://dobon.net/
あたりを参照のこと。
VB でのスレッドの話であれば dobon さんの記事 (上記からリンクがあるが)
http://codezine.jp/article/detail/144

引用返信 編集キー/
■63818 / inTopicNo.6)  Re[5]: 高速 1ms ReadFile
□投稿者/ 774RR (8回)-(2012/10/13(Sat) 19:22:17)
「UIスレッド内に書かれた処理」というのは日本語として変なので訂正。
「UIスレッド内で実行されるべき処理」とでもしておこうか。
「UIスレッド内で実行されるであろう処理」でもいいか。

関数がスレッドに属しているわけではないんで。

引用返信 編集キー/
■63827 / inTopicNo.7)  Re[6]: 高速 1ms ReadFile
□投稿者/ kappa (3回)-(2012/10/15(Mon) 19:40:37)
皆様、いろいろと教えていただきありがとうございます。
結果として、取りこぼしていたと見られましたが、
コードの誤りで取りこぼしたように見えておりました。

ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -