デバイスのポーリングの回避
デバイス ドライバーは、絶対に必要でない限り、デバイスのポーリングを回避し、ポーリングにタイム スライス全体を使用しないようにする必要があります。 デバイスのポーリングは、ポーリング ドライバー内でオペレーティング システムをコンピューティング バインドする、高コストの操作です。 ポーリングが多いデバイス ドライバーは、他のデバイスの I/O 操作に干渉し、システムの速度が低下し、ユーザーに応答しなくなる可能性があります。
最近開発されたデバイスは、Windowsが動作するように設計されているプロセッサと同等に技術的に進んでおり、デバイスがI/O操作を開始する準備ができているか、または操作が完了しているかを確認するために、ドライバがデバイスをポーリングする必要はほとんどありません。
ただし、まだ使用されている一部のデバイスはデータ バスが狭く、クロック レートが遅く、同期 I/O を実行するシングル ユーザーのシングル タスク オペレーティング システムを備えた古いプロセッサで動作するように設計されていました。 このようなデバイスでは、ポーリングや、デバイスがレジスタを更新することを待機するための、その他の手段が必要になる場合があります。
カウンターをインクリメントする単純なループをコーディングすることで、デバイスの更新が登録されている間に最小間隔が「無駄」になり、低速デバイスの問題を解決することが論理的と思われるかもしれませんが、このようなドライバーは Windows プラットフォーム間で移植可能になる可能性はほとんどありません。 ループ カウンターの最大値には、プラットフォームごとにカスタマイズが必要です。 さらに、適切な最適化コンパイラを使用してドライバーがコンパイルされている場合、コンパイラはドライバーのカウンター変数とインクリメントされるループを削除する可能性があります。
注 デバイスハードウェアの更新状態の間にドライバーがストールする必要がある場合は、この実装ガイドラインに従ってください。ドライバーは、デバイス レジスタを読み取る前に KeStallExecutionProcessor を呼び出すことができます。 ドライバーはストールする間隔を最小限に抑える必要があり、一般的にストール間隔を 50 マイクロ秒以下で指定する必要があります。
KeStallExecutionProcessor 間隔の粒度は 1 マイクロ秒です。
デバイス状態の更新に 50 マイクロ秒を超える時間が必要な場合は、ドライバーで デバイス専用スレッド を設定することを検討してください。