Condividi tramite


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:

  1. Salvataggio rapido di informazioni volatili , ad esempio il contenuto del registro, in una routine del servizio di interruzione.
  2. 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.