Manutenzione di un interrupt (UMDF 1)
Avviso
UMDF 2 è la versione più recente di UMDF e sostituisce UMDF 1. Tutti i nuovi driver UMDF devono essere scritti usando UMDF 2. Non vengono aggiunte nuove funzionalità a UMDF 1 ed è disponibile un supporto limitato per UMDF 1 nelle versioni più recenti di Windows 10. I driver di Windows universali devono usare UMDF 2.
Gli esempi di UMDF 1 archiviati sono disponibili nell'aggiornamento degli esempi di driver di Windows 11 versione 22H2 - Maggio 2022.
Per altre info, vedi Introduzione con UMDF.
La manutenzione di un interrupt è costituita da due passaggi:
- Salvataggio rapido di informazioni volatili , ad esempio il contenuto del registro, in una routine del servizio di interruzione.
- Elaborazione delle informazioni volatili salvate in una routine dell'elemento di lavoro.
Quando un dispositivo genera un interrupt hardware, il framework chiama la routine del servizio interrupt del driver (ISR), che i driver basati su framework implementano come funzione di callback OnInterruptIsr .
La funzione di callback OnInterruptIsr , eseguita in PASSIVE_LEVEL, deve salvare rapidamente le informazioni di interruzione, ad esempio il contenuto del registro, accodare un elemento di lavoro per elaborare ulteriormente i dati e restituire dall'ISR per consentire la manutenzione di altri interrupt se la riga di interruzione è condivisa. Poiché l'ISR del driver UMDF viene eseguito in PASSIVE_LEVEL, la gestione degli interrupt basati su linea PCI non è consigliata. Questi interrupt vengono in genere condivisi tra più dispositivi, alcuni dei quali potrebbero non accettare ritardi ISR. Tuttavia, è possibile gestire gli interrupt PCI MSI in un driver UMDF. Questi interrupt hanno semantica perimetrale e non sono condivisi.
In genere, la funzione di callback OnInterruptIsr pianifica un elemento di lavoro per elaborare le informazioni salvate in un secondo momento. I driver basati su framework implementano routine workitem come funzioni di callback OnInterruptWorkItem .
La maggior parte dei driver usa una singola funzione di callback OnInterruptWorkItem per ogni tipo di interrupt. Per pianificare l'esecuzione di una funzione di callback OnInterruptWorkItem , un driver deve chiamare IWDFInterrupt::QueueWorkItemForIsr dall'interno della funzione di callback OnInterruptIsr .
Se il driver crea più oggetti coda del framework per ogni dispositivo, è consigliabile usare un oggetto workitem separato e una funzione di callback OnWorkItem per ogni coda. Per pianificare l'esecuzione di una funzione di callback OnWorkItem , il driver deve prima creare uno o più oggetti workitem chiamando IWdfDevice3::CreateWorkItem, in genere dalla funzione di callback IDriverEntry::OnDeviceAdd del driver. La funzione di callback OnInterruptIsr del driver può quindi chiamare IWDFWorkItem::Enqueue.
I driver in genere completano le richieste di I/O nelle funzioni di callback OnInterruptWorkItem o OnWorkItem .
Per un esempio di driver UMDF che gestisce gli interrupt, vedere il driver di esempio SpbAccelerometer, disponibile a partire da Windows 8 WDK.