Freigeben über


Behandeln von SD-Kartenunterbrechungen

Secure Digital (SD) Karte Treiber verfügen nicht über Interruptdienstroutinen (ISRs) und erfassen keine Interrupt request-Ressourcen (IRQ). Der SD-Bustreiber erkennt Und fängt Hardwareunterbrechungen ab und meldet sie dann an den Gerätetreiber mithilfe der Interruptbenachrichtigungsrückrufroutine PSDBUS_CALLBACK_ROUTINE, wie in den Abschnitten Secure Digital (SD) Driver Stack und Öffnen und Initialisieren einer SD Bus-Schnittstelle erläutert.

Der Gerätetreiber muss die Interruptverarbeitung im Kontext der Rückrufroutine für Interruptbenachrichtigungen nicht abschließen. Der Treiber kann von der Rückrufroutine zurückkehren und die Interruptverarbeitung in seinem eigenen Kontext abschließen. Wenn der Treiber die Verarbeitung des Interrupts abgeschlossen hat, informiert er den Bustreiber durch einen expliziten Aufruf einer Interruptbestätigungsroutine, die mit der SD-Bus-Schnittstelle bereitgestellt wird. Weitere Informationen zur Interruptbestätigungsroutine finden Sie unter PSDBUS_ACKNOWLEDGE_INT_ROUTINE. Wenn der Bustreiber diesen Aufruf empfängt, wird der Interrupt erneut aktiviert.

SD-Gerätetreiber haben zwei Optionen in Bezug auf die IRQ-Ebenen (IRQLs), auf denen sie ausgeführt werden. Ein SD-Treiber kann ausschließlich auf PASSIVE_LEVEL ausgeführt werden, oder er kann DISPATCH_LEVEL ausgeführt werden, während er im Kontext der Rückrufroutine für Unterbrechungsbenachrichtigungen und zu PASSIVE_LEVEL der restlichen Zeit ausgeführt wird. Wenn ein SD-Gerätetreiber ausschließlich bei PASSIVE_LEVEL ausgeführt wird, übernimmt der Bustreiber die Verantwortung für die Synchronisierung von Interrupts. Wählen Sie diese Option aus, wenn Ihr Gerät ohne strikte Begrenzungen der Unterbrechungslatenz betrieben werden kann, da dies den Entwurf Ihres Treibers vereinfacht. Neben der Auslagerung der Aufgabe der Interruptsynchronisierung auf den Bustreiber gibt es noch weitere Vorteile. Für instance müssen Treiber häufig Daten als Reaktion auf einen Interrupt übertragen. Wenn die Rückrufroutine des Treibers bei PASSIVE_LEVEL ausgeführt wird, können Sie einen synchronen E/A-Vorgang anstelle eines asynchronen Vorgangs ausführen. Wenn die Rückrufroutine bei DISPATCH_LEVEL ausgeführt wird, muss der Treiber warten, bis er mit einem niedrigeren IRQL ausgeführt wird, bevor er synchrone E/A-Vorgänge ausführt.

Ein SD-Gerätetreiber gibt den IRQL an, an dem er ausgeführt wird, wenn er die SD-Busschnittstelle initialisiert. Um bei DISPATCH_LEVEL in der Rückrufroutine für Interruptbenachrichtigungen ausgeführt zu werden, muss der Treiber das Element CallbackAtDpcLevel der SDBUS_INTERFACE_PARAMETERS Struktur auf TRUE festlegen und diese Struktur an die Schnittstelleninitialisierungsroutine übergeben. Eine Beschreibung der Schnittstellenroutine finden Sie unter PSDBUS_INITIALIZE_INTERFACE_ROUTINE. Damit sie ausschließlich bei PASSIVE_LEVEL ausgeführt werden können, muss der Treiber CallbackAtDpcLevel auf FALSE festlegen.