Обслуживание прерывания (UMDF 1)
Предупреждение
UMDF 2 является последней версией UMDF и заменяет UMDF 1. Все новые драйверы UMDF должны быть написаны с помощью UMDF 2. В UMDF 1 новые функции не добавляются, а поддержка UMDF 1 в более новых версиях Windows 10 ограничена. Универсальные драйверы Windows должны использовать UMDF 2.
Архивные примеры UMDF 1 можно найти в Windows 11 версии 22H2 — обновление примеров драйверов за май 2022 г.
Дополнительные сведения см. в разделе начало работы с помощью UMDF.
Обслуживание прерывания состоит из двух этапов:
- Быстрое сохранение изменяемой информации (например, содержимого регистрации) в рамках процедуры прерывания обслуживания.
- Обработка сохраненных переменных данных в подпрограмме workitem.
Когда устройство создает аппаратное прерывание, платформа вызывает подпрограмму службы прерываний драйвера (ISR), которую драйверы на основе платформы реализуют как функцию обратного вызова OnInterruptIsr .
Функция обратного вызова OnInterruptIsr , которая выполняется в PASSIVE_LEVEL, должна быстро сохранять сведения об прерывании, такие как содержимое регистрации, помещать в очередь рабочий элемент для дальнейшей обработки данных и возвращать из ISR, чтобы разрешить обслуживание других прерываний, если строка прерывания является общей. Так как ISR драйвера UMDF работает в PASSIVE_LEVEL, обработка прерываний на основе линий PCI не рекомендуется. Эти прерывания обычно совместно используются несколькими устройствами, некоторые из которых могут не принимать задержки ISR. Однако вы можете обрабатывать прерывания MSI PCI в драйвере UMDF. Эти прерывания имеют граничную семантику и не являются общими.
Как правило, функция обратного вызова OnInterruptIsr планирует рабочий элемент для последующей обработки сохраненных сведений. Драйверы на основе платформы реализуют подпрограммы workitem как функции обратного вызова OnInterruptWorkItem .
Большинство драйверов используют одну функцию обратного вызова OnInterruptWorkItem для каждого типа прерывания. Чтобы запланировать выполнение функции обратного вызова OnInterruptWorkItem , драйвер должен вызвать IWDFInterrupt::QueueWorkItemForIsr из функции обратного вызова OnInterruptIsr .
Если драйвер создает несколько объектов очереди платформы для каждого устройства, можно использовать отдельный объект workitem и функцию обратного вызова OnWorkItem для каждой очереди. Чтобы запланировать выполнение функции обратного вызова OnWorkItem , драйвер должен сначала создать один или несколько объектов workitem, вызвав IWdfDevice3::CreateWorkItem, как правило, из функции обратного вызова IDriverEntry::OnDeviceAdd . Затем функция обратного вызова OnInterruptIsr драйвера может вызвать IWDFWorkItem::Enqueue.
Драйверы обычно выполняют запросы ввода-вывода в функциях обратного вызова OnInterruptWorkItem или OnWorkItem .
Пример драйвера UMDF, обрабатывающего прерывания, см. в примере драйвера SpbAccelerometer, доступном начиная с Windows 8 WDK.