割り込みの処理 (UMDF 1)
警告
UMDF 2 は UMDF の最新バージョンであり、UMDF 1 よりも優先されます。 すべての新しい UMDF ドライバーは、UMDF 2 を使用して記述する必要があります。 UMDF 1 には新機能が追加されておらず、Windows 10 の新しいバージョンでは UMDF 1 のサポートが制限されています。 ユニバーサル Windows ドライバーでは、UMDF 2 を使用する必要があります。
アーカイブされた UMDF 1 サンプルは、「Windows 11、バージョン 22H2 - 2022 年 5 月 ドライバーサンプルの更新」でご確認いただけます。
詳しくは、「UMDF の概要」をご覧ください。
割り込みの処理は、次の 2 つの手順で構成されます。
- 割り込みサービス ルーチンで揮発性の情報 (レジスタの内容など) をすばやく保存します。
- 保存された揮発性情報を作業項目ルーチンで処理します。
デバイスがハードウェア割り込みを生成すると、フレームワークはドライバーの割り込みサービス ルーチン (ISR) を呼び出します。このルーチンは、フレームワーク ベースのドライバーが OnInterruptIsr コールバック関数として実装します。
PASSIVE_LEVEL で実行される OnInterruptIsr コールバック関数は、レジスタの内容などの割り込み情報をすばやく保存し、さらにデータを処理するために作業項目をキューに入れ、割り込みラインが共有されている場合には他の割り込み処理のために ISR から戻らなければなりません。 UMDF ドライバーの ISR は PASSIVE_LEVEL で実行されるため、PCI ライン ベースの割り込みの処理はお勧めしません。 通常、これらの割り込みは複数のデバイス間で共有され、その一部は ISR 遅延を受け入れられない可能性があります。 しかし、UMDF ドライバーで PCI MSI 割り込みを処理することができます。 これらの割り込みはエッジ セマンティクスを持ち、共有されません。
通常、OnInterruptIsr コールバック関数は、保存された情報を後で処理するように作業項目をスケジュールします。 フレームワーク ベースのドライバーは、OnInterruptWorkItem コールバック関数として作業項目ルーチンを実装します。
ほとんどのドライバーは、割り込みの種類ごとに 1 つの OnInterruptWorkItem コールバック関数を使用します。 OnInterruptWorkItem コールバック関数の実行をスケジュールするには、ドライバーが OnInterruptIsr コールバック関数内から IWDFInterrupt::QueueWorkItemForIsr を呼び出す必要があります。
ドライバーがデバイスごとに複数のフレームワーク キュー オブジェクトを作成する場合は、キューごとに個別の作業項目オブジェクトと OnWorkItem コールバック関数を使用することを検討してください。 OnWorkItem コールバック関数の実行をスケジュールするには、ドライバーは最初に IWdfDevice3::CreateWorkItem を呼び出して 1 つ以上の作業項目オブジェクトを作成する必要があります。通常は、ドライバーの IDriverEntry::OnDeviceAdd コールバック関数から呼び出します。 その後、ドライバーの OnInterruptIsr コールバック関数は IWDFWorkItem::Enqueue を呼び出すことができます。
ドライバーは通常、OnInterruptWorkItem または OnWorkItem コールバック関数で I/O 要求を完了します。
割り込みを処理する UMDF ドライバーの例については、Windows 8 WDK 以降で使用可能な SpbAccelerometer サンプル ドライバーを参照してください。