背景情報:
私は現在、USBポートに接続するハードウェアデバイスを持っています。ハードウェアデバイスは、さまざまなネットワークに正確な定期的なメッセージを送信し、ネットワークも接続します。ハードウェアデバイスの中には、MicrochipdsPICがいくつかあります。動作には2つのモードがあります。
1つのシナリオは、単純な「ジョブ」をdsPICに送信し、それが.001msの精度で正確なメッセージを送信できる場合です。このアーキテクチャは、PCアプリケーション内で発生するイベントに基づいて変化する定期的なパケットを送信する必要がある、より複雑なメッセージングには理想的ではありません。したがって、PCアプリケーションが定期的なメッセージを送信し、dsPICがそれに応じて変換して送信するという2番目の操作モードがあります。ちなみに、これはすべて、当社のソフトウェアのエンドユーザーに対して透過的です。当社のハードウェアデバイスは、自動車分野で使用されるテストツールです。
現在、ハードウェアをPCソフトウェアに接続するために、FTDIおよびFTDIWindowsドライバーからのシリアルチップへのUSBを使用しています。
問題は、PCからメッセージを送信するモード2では、平均的なハードウェア範囲で約1ミリ秒を達成できることです。Windowsカーネルのプリエンプションの対象となります。私は次のようなことを改善するためにいくつかの「トリック」を試しました。
- 可能な場合は、リーダースレッドとライタースレッドが別々のCPUアフィニティで動作することを確認してください。
- リーダーのスレッド優先度を下げながら、ライターのスレッド優先度を上げます。
- 当社のソフトウェアを使用する際にスクリーンセーバーやその他のアプリケーションをオフにするようにユーザーに通知します。
- createthread呼び出しをCreateTimerQueueTimer呼び出しに置き換えます。
私たちのソフトウェアはすべてC/C++で書かれています。私は高度なWindowsプログラミングに非常に精通していて快適です。IO完了、重複I / O、ロックレススレッドキュー(実際には設計戦略)、ソケット、スレッド、セマフォなど...
しかし、私はWindowsドライバーの開発については何も知りません。KMDFとUDMFとWDMに関するいくつかの論文を読みました。
ベテランのWindowsカーネルモードドライバー開発者がここで応答することを期待しています...
次の回転。私たちのハードウェアの一部には、FTDIチップを交換して、dsPICのUSBインターフェイスを使用するか、場合によっては、オープンソースのLinux FTDIをWindowsに移植して、カスタムドライバー内でFTDIチップを引き続き使用するオプションがあります。PC側のカーネルモードドライバーに行くことで、プリエンプションやDMAを利用することなく、より正確な間隔で定期的なメッセージを送信できるカーネルドライバーを確立できると思います。
私たちのビジネスには、彼らのツールとまったく同じようなことをしていると思う競合他社がいます。私の知る限り、ユーザースペースアプリケーションは1msを超えるスレッドをスケジュールすることはできません。現在、スレッドでtimeGetTimeを使用しています。私は(CreateTimerQueueTimerを介して)タイマーキューを試しましたが、実際の改善はありませんでした。
WDMは、より正確なタイミングを実現するための正しいアプローチですか?
競合他社は、Windows駆動の信号からハードウェアへの非常に正確なタイミングをどのように達成しており、カーネルドライバー(.sys)をロードし、デバイスは私たちと同じようにUSB2.0上で実行されます。
WDMが進むべき道である場合、タイミングを設定するためにどのカーネル機能を研究する必要があるかについてアドバイスを得ることができますか?読んでくれてありがとう