割り込み同期のオブジェクト
PortCls システム ドライバーは、ミニポート ドライバーのメリットを活かすため、IInterruptSync インターフェイスを実装します。 IInterruptSync は、割り込みサービス ルーチン (ISR) の一覧の実行を非割り込みルーチンと同期する割り込み同期オブジェクトを表しています。
割り込み同期オブジェクトには、次の 2 つの主な機能があります。
割り込みに対する ISR の一覧の実行。 同期オブジェクトは、割り込みソースに接続されます。 割り込みが発生するたびに、同期オブジェクトは、選択したモードに従って指定された順序で ISR を実行します。 (3 つのモードについては、次の説明をご覧ください。)
ISR ではないルーチンの実行。 これらの非割り込みルーチンは、同期オブジェクトの割り込みに接続されません。 代わりに、非割り込みルーチンは、呼び出し元の選択時点で実行されます。 ただし、同期オブジェクトは、オブジェクトの ISR の一覧を使用して非割り込みルーチンを同期的に実行します。 言い換えると、非割り込みルーチンは、同期オブジェクトの一覧の ISR が実行を開始する前に、完了するまで実行されます。その逆も同様です。
割り込み同期オブジェクトは、複数の ISR を柔軟に処理できます。 ISR は、同期オブジェクトが割り込み時に走査する、リンクされた一覧に存在します。 ミニポート ドライバーは、同期オブジェクトに ISR を登録するとき、ISR をこの一覧の先頭または末尾に追加するかどうかを指定します。
ミニポート ドライバーは、PcNewInterruptSync 関数を呼び出して、割り込み同期オブジェクトを作成します。 この呼び出し中、ドライバーは、オブジェクトが割り込み時に ISR の一覧を走査する方法を指定します。 この呼び出しでは、次の表の INTERRUPTSYNCMODE 列挙定数で指定された 3 つのオプションがサポートされています。
定数 | 説明 |
---|---|
InterruptSyncModeNormal |
一覧内の各 ISR を呼び出します。そのうちの 1 つが STATUS_SUCCESS を返すまで呼び出します。 |
InterruptSyncModeAll |
上記の ISR のリターン コードに関係なく、一覧内の各 ISR を 1 回だけ呼び出します。 |
InterruptSyncModeRepeat |
一覧内のどの ISR も STATUS_SUCCESS を返さない一覧のトリップが発生するまで、ISR の一覧全体を走査します。 |
InterruptSyncModeNormal モードでは、同期オブジェクトは、ISR のいずれかが STATUS_SUCCESS を返すまで、一覧内の各 ISR を呼び出します。 この ISR に続く一覧の ISR が呼び出されることはありません。 このモードは、オペレーティング システムが通常 ISR を処理する方法をエミュレートします。 どの ISR も STATUS_SUCCESS を返さない場合、動作は InterruptSyncModeAll と同じです。
InterruptSyncModeAll モードでは、上記の ISR のリターン コードに関係なく、一覧内の各 ISR が 1 回だけ呼び出されます。 これは、割り込みのソースが決定論的ではないより原始的なハードウェアを対象としていますが、他の状況でも役立つ場合があります。 たとえば、特定の割り込みが 2 つのソースのうちどちらから発生しているかに関係なく、割り込みごとに 2 つの割り込みソースが緊密に同期される可能性があります。
InterruptSyncModeRepeat モードでは、同期オブジェクトは、一覧内のどのルーチンも STATUS_SUCCESS を返さない一覧のトリップが発生するまで、ISR の一覧全体を繰り返し走査します。 このモードは、複数のソースからの割り込みが同じ割り込みラインで同時に発生したり、ISR 処理中に 2 つ目の割り込みが発生したりする場合に適しています。 各割り込みソースは、処理が必要かどうかを判断できる必要があります。 常に STATUS_SUCCESS を返す ISR がこのモードで同期オブジェクトに登録されている場合、システムは応答を停止します。
これらのいずれかのモードで、登録された ISR のいずれかが STATUS_SUCCESS を返した場合、同期オブジェクトはオペレーティング システムへの割り込みを確認します。 3 つのモードすべてで、割り込みを正常に処理しなかったことをすべての割り込みソースが示している場合、同期オブジェクトは、失敗した結果コードをオペレーティング システムに返します。
IInterruptSync インターフェイスでは、次のメソッドがサポートされています。