Condividi tramite


Gestione degli interruzioni della scheda SD

I driver della scheda Secure Digital (SD) non dispongono di routine di servizio di interruzione (ISR) e non acquisiscono risorse di richiesta di interruzione (IRQ). Il driver del bus SD rileva e intercetta gli interruzioni hardware e li segnala al driver del dispositivo tramite la routine di callback di notifica di interruzione PSDBUS_CALLBACK_ROUTINE, come illustrato nelle sezioni Stack di driver Secure Digital (SD) e Apertura e inizializzazione di un'interfaccia del bus SD.

Il driver del dispositivo non deve completare l'elaborazione degli interruzioni nel contesto della routine di callback di notifica di interruzione. Il driver può tornare dalla routine di callback e completare l'elaborazione degli interruzioni nel proprio contesto. Al termine dell'elaborazione dell'interruzione, informa il conducente del bus tramite una chiamata esplicita a una routine di riconoscimento dell'interruzione fornita con l'interfaccia del bus SD. Per altre informazioni sulla routine di riconoscimento dell'interruzione, vedere PSDBUS_ACKNOWLEDGE_INT_ROUTINE. Quando il driver del bus riceve questa chiamata, abilita nuovamente l'interruzione.

I driver di dispositivo SD hanno due opzioni rispetto ai livelli IRQ (IRQLs) in cui vengono eseguiti. Un driver SD può essere eseguito esclusivamente in PASSIVE_LEVEL oppure può essere eseguito in DISPATCH_LEVEL mentre nel contesto della routine di callback di notifica di interruzione e in PASSIVE_LEVEL il resto del tempo. Quando un driver di dispositivo SD viene eseguito esclusivamente in PASSIVE_LEVEL, il driver del bus presuppone la responsabilità della sincronizzazione degli interruzioni. Scegliere questa opzione se il dispositivo può funzionare senza limiti rigorosi sulla latenza degli interruzioni perché semplifica la progettazione del driver. Oltre a scaricare l'attività di sincronizzazione degli interruzioni nel driver del bus, esistono altri vantaggi. Ad esempio, i driver devono trasferire spesso i dati in risposta a un interruzione. Se la routine di callback del driver è in esecuzione in PASSIVE_LEVEL, è possibile eseguire un'operazione di I/O sincrona anziché una asincrona. Se la routine di callback viene eseguita in DISPATCH_LEVEL, il driver deve attendere fino a quando non viene eseguito in un irQL inferiore prima di eseguire operazioni di I/O sincrone.

Un driver di dispositivo SD specifica il irQL in corrispondenza del quale verrà eseguito quando inizializza l'interfaccia del bus SD. Per eseguire in DISPATCH_LEVEL nella routine di callback di notifica di interruzione, il driver deve impostare il membro CallbackAtDpcLeveldella struttura SDBUS_INTERFACE_PARAMETERS su TRUE e passare questa struttura alla routine di inizializzazione dell'interfaccia. Per una descrizione della routine dell'interfaccia, vedere PSDBUS_INITIALIZE_INTERFACE_ROUTINE. Per eseguire esclusivamente in PASSIVE_LEVEL, il driver deve impostare CallbackAtDpcLevel su FALSE.