2003.1.20 新規

はじめに

 私がEZ-USB(主にAN2135SC)を使用してみて、そのとき感じたボトルネックや高速化のポイントを適当にまとめた物です。
 ここではEZ-USBと、CypressのDev-Kitに含まれるドライバを用いてアクセスする場合におけるポイントをいくつか簡単に紹介します。

EZ-USBの処理速度

 PCにくらべるとEZ-USBの処理速度は3桁以上遅い。(1000MHz:6MHzとかね)
 EZ-USBのポートをインテリジェントに操作する場合等では、USB通信速度よりもEZ-USBの処理速度の方が十分に遅い。
 たとえば、同期シリアル送信の場合に、USBデータ1byteに8bit割り当ててEZ-USBでシフト展開するよりも、1byteに1bitを割り当て、EZ-USBで垂れ流すだけの方が早いことがある。

●USB間のデータ効率化より、EZ-USB側の処理を簡素化を最優先する。
●データの加工/復元はPC側で行い、EZ-USBでは最低限のI/O操作だけ行う。
●EZ-USBの処理速度を超えるシーケンスには、CPLDやFPGAを併用する。

Cypress Dev-KitのドライバーとUSBに関して

 バルク転送を行うとき、少ないデータ(といっても数パケット分)を分割して送信すると極端に遅くなる。
 IOCTL呼び出し部か、USBドライバ層そのもののオーバーヘッドが大きいようで、IOCTL呼び出し回数を減らすと改善される。

●できるだけ大量のデータにまとめ、一度に転送する。
●大量データの送受信を行う場合、受信と送信を別スレッドかオーバーラップ(注)を使って同時に行う。1つのスレッドで送信/受信を交互に行うとメチャ遅い

注:オーバーラップリード動作は未確認で、その可否は不明です。

パラレルポートからの置き換え

 EZ-USBの転送速度はUSB1.1のFullSpeed=12MBit/secであり、パラレルポートを直接たたく場合と比べると同等〜2倍、ECPやEPPと比べても半分程度の速度があります。
 しかし、USBインターフェースは、直接ポートを操作するようなダイレクトI/Oではなく、ある程度データをまとめて送るパケット型のインターフェースなので、細切れデータやデータの送受信などには非常に弱いです。
 この辺を考慮しないと、USBは大変遅いデバイスとなってしまいます。

 たとえばポートに書き込んで、直後に読み込むシーケンスでは、
パラレル=I/Oライト -> I/Oリード =2uSec.程度
USB=キャプチャ->USB送信->EZ-USB処理->USB受信=数mSec.
 と桁違いに遅くなってしまいます。

●書き込み処理が連続する場合は、ある程度まとめにしてから送信する。
●連続的な読み書き動作も、プロトコルを決めてまとめて行う。
●可能なら、読み込み(受信)中に次の書き込みデータを処理(用意)する。


要するに

●USBデータプロトコルでは、EZ-USB処理の簡素化を第1に考える。
●USB転送はブロック化して、処理をある程度まとめて行う。
●USB転送のブロック長は、できるだけ大きく取る。
●送信と受信をオーバーラップさせて、受信待ち時間を極力減らす。