Freigeben über


Unterbrechungen von SPB-verbundenen Peripheriegeräten

Im Gegensatz zu einem Bus wie PCI bietet ein einfacher Peripheriebus (SPB), wie I2C oder SPI, keine standardisierten, busspezifischen Mittel, um Interruptanforderungen von Peripheriegeräten an den Prozessor zu übermitteln. Stattdessen signalisiert ein mit SPB verbundenes Peripheriegerät einen Interrupt über einen separaten Hardwarepfad, der sich außerhalb des SPB- und des SPB-Controllers befindet. Die Details dieses Unterbrechungspfads variieren in der Regel von Hardwareplattform zu Hardwareplattform, aber Windows blendet diese Details im Treiber für ein mit SPB verbundenes Peripheriegerät aus, damit der Treiber auf einer Vielzahl von Hardwareplattformen arbeiten kann.

In der Regel ist die Interruptanforderungszeile eines mit SPB verbundenen Peripheriegeräts mit einem Pin an einem GPIO-Controller (General Purpose E/O) verbunden, und die GPIO-Controllerrelais unterbricht vom Gerät an den Prozessor. Weitere Informationen finden Sie unter GPIO-Interrupts.

Der Treiber für Peripheriegeräte ruft diesen GPIO-Interrupt als abstrakte Windows-Interruptressource (CmResourceTypeInterrupt) ab und verbindet den Interrupt mit der Interrupt-Dienstroutine (ISR) des Treibers. Die Interruptrestraktion blendet die plattformspezifischen Details des Interrupts vor dem Treiber aus. Beispielsweise kann der Treiber Details ignorieren, z. B. ob der Interrupt von einem GPIO-Pin oder von einer anderen Quelle empfangen wird. Um diese Abstraktion aufrechtzuerhalten, muss der Interrupt-Trap-Handler des Kernels, der bei DIRQL ausgeführt wird, möglicherweise eine aktive Interruptanforderung beenden, indem er den Interrupt am GPIO-Pin löscht oder vorübergehend maskiert. Die Hardwareregister des GPIO-Controllers sind in der Regel speicherseitig zugeordnet und können über DIRQL aufgerufen werden.

Im Gegensatz dazu ist ein mit SPB verbundenes Peripheriegerät nicht speicherseitig zugeordnet, und der ISR für dieses Gerät muss in der Regel mit IRQL = PASSIVE_LEVEL ausgeführt werden. Um auf die Hardwareregister im Gerät zuzugreifen, sendet der ISR E/A-Anforderungen, um serielle Übertragungen über den SPB durchzuführen. Solche Übertragungen sind relativ langsam und können nicht in einer ISR ausgeführt werden, die mit DIRQL ausgeführt wird. Ein ISR auf passiver Ebene kann jedoch eine E/A-Anforderung synchron senden und dann blockieren, bis die Anforderung abgeschlossen ist.

Bei einem vom Edge ausgelösten Interrupt löscht der Trap-Handler des Kernels automatisch die Interruptanforderung am GPIO-Pin und plant dann die Ausführung des ISR des Geräts auf passiver Ebene. Der Trap-Handler muss den Interrupt löschen, um zu verhindern, dass derselbe Interrupt erneut auftritt, nachdem der Trap-Handler zurückgegeben wird.

Bei einem leveltriggerten Interrupt maskiert der Interrupt-Trap-Handler des Kernels automatisch die Interruptanforderung am GPIO-Pin und plant dann die Ausführung des ISR des Geräts auf passiver Ebene. Der ISR muss die Interruptanforderung vom Gerät löschen. Nachdem der ISR zurückgegeben wurde, entlarmt der Kernel die Interruptanforderung am GPIO-Pin.

Der ISR auf passiver Ebene des Geräts sollte nur die anfängliche Wartung des Interrupts ausführen und dann zurückkehren, um zu vermeiden, dass ISRs auf passiver Ebene für andere Geräte verzögert werden. In der Regel sollte der Treiber zusätzliche Interrupt-bezogene Verarbeitung auf den Interrupt-Workerthread zurückstellen, der mit einer niedrigeren Priorität als der ISR ausgeführt wird.

Ab Windows 8 unterstützt das User-Mode Driver Framework (UMDF) ISRs für UMDF-Treiber. Der UMDF-Treiber für ein SPB-Peripheriegerät ruft die IWDFDevice3::CreateInterrupt-Methode auf, um einen ISR mit dem Interrupt des Geräts zu verbinden. Wenn das Gerät eine Interruptanforderung signalisiert, plant der Trap-Handler des Kernels die Ausführung des ISR auf passiver Ebene. Weitere Informationen finden Sie unter Zugreifen auf Hardware und Behandeln von Interrupts.

Ab Windows 8 unterstützt das Kernelmodustreiberframework (KMDF) ISRs auf passiver Ebene. Der KMDF-Treiber für ein SPB-Peripheriegerät ruft die WdfInterruptCreate-Methode auf, um einen ISR auf passiver Ebene mit dem Interrupt des Geräts zu verbinden. Einer der Eingabeparameter für diese Methode ist ein Zeiger auf eine WDF_INTERRUPT_CONFIG-Struktur , die Konfigurationsinformationen für den Interrupt enthält. Um den ISR für die Ausführung auf passiver Ebene zu konfigurieren, legen Sie den PassiveHandling-Member dieser Struktur auf TRUE fest. Weitere Informationen finden Sie unter Unterstützung Passive-Level Interrupts.