2017-09-22 7 views
0

これはWinUsbドライバとライブラリを使用した私の最初のプロジェクトです。WinUsb:OUTパイプへの書き込みは、INパイプのデータ破損を引き起こします。

私のホストコンピュータはWINDOWS 10を動作させ、すべてのアップデートがインストールされています。 私の高速デバイスは、3つのデータエンドポイントを操作します - OUTコマンドエンドポイント:ホストコンピュータがコマンドを送信するためにホストコンピュータを使用します - IN応答エンドポイント:ホストコンピュータが各コマンドへの応答を受信します - INストリームエンドポイント: の期間が10ミリ秒の1600バイト。ホストアプリケーションで

、2件の関連スレッドがあります - コマンド・スレッドは、パイプをコマンドにコマンドを送信し、 返信パイプ からの応答を受け取る - ストリームスレッドがストリームパイプからデータを収集 非待機機能は、すべてのパイプに使用されています。

別のスレッドが中断されている場合、各スレッドは完全に機能します。 しかし、2つのスレッドが同時に動作する場合、ストリームデータは任意の点で破損しているように見えます。

さらに分析したところ、次の事実が明らかになりました。 - 不正なバイトの連続したシーケンスとして破損が表示されます。 の間違ったシーケンスの長さは、おおよそ のコマンドと応答の長さに対応します。 - パケット境界に関係しない任意の点から間違ったシーケンスが始まります。 - 間違ったバイトは異なる場合があります。時々、それらはすべてゼロです。 時々それらはゴミとして見えます。 - 時間分析では、コマンドが コマンドパイプに送信されると、破損が発生することが示唆されています。

は、スレッド間で同期を実装するとが消えるため、読み書き操作が時間的に分離されます。しかし、これは受け入れられない解決策です。私は2つのスレッドを非同期で動作させたいと思っています。 誰もそのような影響に直面していますか?自分の質問に答える

+0

ライブラリが疑われる理由はあまりありません。特に、どのくらい頻繁にハンマーが掛かっているのか、それほど多くないことを考えれば、これはデバイスファームウェアで間違っている可能性が非常に高いです。何が効くの? –

+0

デバイスのファームウェアは私の最初の推測でした。特に、それは私のプロジェクトの一部でもあります。そのため、転送前後のストリームバッファの整合性チェックを実装しました。問題は見つかりませんでした。 –

+0

ライブラリでもファームウェアでもない場合、ハードウェアのみが残っていますか? –

答えて

0

...

ハンスはコメントは正しかったが、問題は、ファームウェアに根ざしました。

詳細はデバイスファームウェア開発者にとって興味深いかもしれません。特に私がAtmel Cortex M7シリーズを使用している場合は、これが面白いかもしれません。

このシリーズでは、USBコントローラにエンドポイントバッファリング用のデュアルポートRAMが含まれています。 DPRAMは、ハードウェアによってのみ割り当てられ、管理されます。ファームウェアは、エンドポイント制御レジスタのALLOCビットをセットすることにより、割り付けを初期化します。ユーザマニュアルでは、ファームウェアはALLOCビットを昇順に設定する必要があります。いったんプロジェクトの履歴が終わると、この変更がDPRAM割り当ての昇順に違反していることを認識せずに、エンドポイント記述子のエンドポイントアドレスを変更しました。その結果、エンドポイントバッファがオーバーラップしているように見えたため、この問題で説明されているデータ干渉が発生しました。

バグを修正した後、すべて正常に動作します。

関連する問題