DeviceIoControl を複数回使用してUSB通信の速度

こんにちは。

USB 通信アプリを作成しています。
環境は、ターゲットデバイス(SH7045、M66590FP、エンドポイントバッファ512Byte)、デバイスドライバ(KMDF)、
PC(WinXP SP3、Pentium D 3.19GHz、メモリ3GB)、アプリ(VC9.0 MFC)となります。

DeviceIoControl を複数回使用して以下のような受信処理をしています。
※ ターゲットの仕様で 1回のデータ受信が 2048 Byte 固定になっています。

DeviceIoControl( 2048 Byte 受信 ); --> 1
DeviceIoControl( 2048 Byte 受信 ); --> 2
DeviceIoControl( 2048 Byte 受信 ); --> 3
DeviceIoControl( 2048 Byte 受信 ); --> 4

このとき 1 の 2048 Byte 受信時は USB アナライザ(LE-620HS) で計測すると 300Mbps 程度出ているのですが、
1 から 2、2 から 3、のように次回の DeviceIoCotrol を呼び出すときに、
およそ 250us ~ 350us 程度時間が掛かっています。(アナライザ上で確認)

つまり 1 から 4 のように DeviceIoControl 複数回で受信した場合、上記のウェイト時間が入るため、DeviceIoControl 単体で
受信した場合と比べ、合計でかなりのタイムロスになります。(当然 300Mbps は出ません。)

これは DeviceIoControl の仕組み上、仕方のないことなのでしょうか?(上記の時間くらいのオーバーヘッドがある??)
それとも上記のようなウェイト時間を省くような処理があるのでしょうか?
ご教授いただければ幸いです。

こんにちは。 ところ

こんにちは。
ところで、受信は同期でしょうか非同期でしょうか。
非同期として、私はこう考えてみましたが、どうでしょう。(あってる保証はありません。)

非同期受信の場合、GetOverlappedResultでDeviceIoControlの処理を待ちます。
1回目の受信で、受信そのものが終わっても、プログラム的にはGetOverlappedResultを待つ分だけオーバーヘッドがあります。
その分、2回目のDeviceIoControlを投げるのも遅くなります。
つまり1回目と2回目の間隔が少し空きます。
それが250usくらい?

#同期だったらどうしよう。

こんにちは。 USBアナ

こんにちは。

USBアナライザで計測されてDeviceIoControlとDeviceIoControlのあいだにロスタイムがあるということですが、1回目のDeviceIoContorlの前処理時間が計測できていなくて2,3,4にロスタイムがあるように見えているのではないでしょうか?

イメージで言うと (前処理)+DeviceIoContorl+前処理+DeviceIoContorl+前処理+DeviceIoContorl+前処理+DeviceIoContorlという感じかな。

ご回答ありがとうご

ご回答ありがとうございます。

同期通信です。

ですが、おっしゃられるように「受信そのものが終わっても~」ということで、プログラム的に何かしらの待ち時間(非同期の場合は、GetOverlappedResultを待つ時間など)があるかもしれませんんね。

つまり、あるデータを1回の DeviceIoControl 呼び出しで受信する場合と、複数回に小分けにして受信する場合では、小分けにした分だけ、DeviceIoControl をコールすることになり、その分だけ関数呼び出しのオーバーヘッドがかかり、タイムロスになるのかなと。

たとえば 1000Byte のデータを受信する場合、
(1) DeviceIoControl( 1000Byte 受信);

(2) for( i = 0; i < 10; i++ ) {
DeviceIoControl( 100Byte 受信);
}

上記の(1)、(2)、では同じ 100Byte のデータを受信するのに、(2)の方が遅くなる、といったことかなと思ってます。

そういえば、USBプロ

そういえば、USBプロトコルのフレーム開始は125μSecごとなので、データパケットのサイズとトランザクションの詰め込み具合によっては次のDeviceIoControlによるフレームの開始によるフレーム待ち(と呼んでいいのかな?)がロスタイムになっているかもしれませんね。