Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Der PortCls-Systemtreiber implementiert die IInterruptSync-Schnittstelle für den Vorteil von Miniporttreibern. IInterruptSync stellt ein Interrupt-Synchronisierungsobjekt dar, das die Ausführung einer Liste der Interrupt-Dienstroutinen (ISRs) mit Nicht-Interrupt-Routinen synchronisiert.
Interrupt-Synchronisierungsobjekte bieten zwei wichtige Funktionen:
Ausführung einer Liste der ISRs als Antwort auf einen Interrupt. Das Synchronisierungsobjekt ist mit einer Interruptquelle verbunden. Jedes Mal, wenn der Interrupt auftritt, führt das Synchronisierungsobjekt die ISRs in einer angegebenen Reihenfolge gemäß dem ausgewählten Modus aus. (Siehe die folgende Beschreibung der drei Modi.)
Ausführung von Routinen, die keine ISRs sind. Diese interrupfreien Routinen sind nicht mit dem Interrupt des Synchronisierungsobjekts verbunden. Stattdessen wird eine Nicht-Unterbrechungsroutine zu einem Zeitpunkt der Auswahl des Anrufers ausgeführt. Das Synchronisierungsobjekt führt jedoch die nicht unterbrechende Routine synchron mit der Liste der ISRs des Objekts aus. Anders ausgedrückt: Die Nicht-Unterbrechungsroutine wird bis zum Abschluss ausgeführt, bevor eine der ISRs in der Liste des Synchronisierungsobjekts mit der Ausführung beginnt und umgekehrt.
Ein Interrupt-Synchronisierungsobjekt ist flexibel im Umgang mit mehreren ISRs. Die ISRs befinden sich in einer verketteten Liste, die das Synchronisierungsobjekt während der Unterbrechung durchläuft. Wenn ein Miniporttreiber einen ISR mit einem Synchronisierungsobjekt registriert, gibt er an, ob der ISR am Anfang oder Ende dieser Liste hinzugefügt werden soll.
Ein Miniporttreiber ruft die PcNewInterruptSync-Funktion auf, um ein Interrupt-Synchronisierungsobjekt zu erstellen. Während dieses Aufrufs gibt der Treiber die Art und Weise an, wie das Objekt zum Zeitpunkt einer Unterbrechung seine Liste der ISRs durchlaufen soll. Der Aufruf unterstützt die drei Optionen, die durch die INTERRUPTSYNCMODE-Enumerationskonstanten in der folgenden Tabelle angegeben werden.
| Dauerhaft | Bedeutung |
|---|---|
InterruptSyncModeNormal- |
Rufen Sie jeden ISR in der Liste auf, bis einer von ihnen STATUS_SUCCESS zurückgibt. |
InterruptSyncModeAll- |
Rufen Sie jeden ISR in der Liste genau einmal auf, unabhängig von den Rückgabecodes der vorherigen ISRs. |
InterruptSyncModeRepeat |
Durchlaufen Sie die gesamte Liste der ISRs, bis ein Durchlauf der Liste erfolgt, bei dem kein ISR in der Liste STATUS_SUCCESS zurückgibt. |
Im InterruptSyncModeNormal-Modus ruft das Synchronisierungsobjekt jeden ISR in der Liste auf, bis einer von ihnen STATUS_SUCCESS zurückgibt. Alle ISRs in der Liste, die diesem ISR folgen, werden nicht aufgerufen. Dieser Modus emuliert die Art und Weise, wie das Betriebssystem ISRs normalerweise behandelt. Wenn keiner der ISRs STATUS_SUCCESS zurückgibt, ist das Verhalten identisch mit InterruptSyncModeAll.
Im InterruptSyncModeAll-Modus wird jeder ISR in der Liste genau einmal aufgerufen, unabhängig von den Rückgabecodes der vorherigen ISRs. Dies ist für primitivere Hardware vorgesehen, bei der die Quelle des Interrupts nicht deterministisch ist, obwohl sie auch in anderen Situationen nützlich sein kann. Beispielsweise können zwei Interruptquellen bei jedem Interrupt eng synchronisiert werden, unabhängig davon, aus welchen der beiden Quellen ein bestimmter Interrupt stammt.
Im InterruptSyncModeRepeat-Modus durchläuft das Synchronisierungsobjekt wiederholt die gesamte Liste der ISRs, bis eine Reise durch die Liste stattfindet, in der keine Routine in der Liste STATUS_SUCCESS zurückgibt. Dieser Modus eignet sich für Situationen, in denen Unterbrechungen aus mehreren Quellen gleichzeitig auf derselben Unterbrechungslinie ausgelöst werden, oder ein zweiter Interrupt kann während der ISR-Verarbeitung ausgelöst werden. Jede Unterbrechungsquelle muss in der Lage sein zu bestimmen, ob die Verarbeitung erforderlich ist. Das System reagiert nicht mehr, wenn ein ISR, der immer STATUS_SUCCESS zurückgibt, in diesem Modus mit einem Synchronisierungsobjekt registriert ist.
In einem dieser Modi erkennt das Synchronisierungsobjekt den Interrupt an das Betriebssystem an, wenn eines der registrierten ISRs STATUS_SUCCESS zurückgibt. Wenn in allen drei Modi alle Interruptquellen angeben, dass sie den Interrupt nicht erfolgreich behandelt haben, gibt das Synchronisierungsobjekt einen nicht erfolgreichen Ergebniscode an das Betriebssystem zurück.
Die IInterruptSync-Schnittstelle unterstützt die folgenden Methoden: