Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Драйвер Windows Driver Frameworks (WDF), обрабатывающий аппаратные прерывания устройства, должен создать объект прерывания фреймворка для каждого поддерживаемого устройством прерывания. В версиях платформы начиная с 1.11, работающих на Windows 8 и позднее, драйверы Kernel-Mode Driver Framework (KMDF) и User-Mode Driver Framework (UMDF) могут создавать объекты прерывания, требующие
Драйвер обычно создает объекты прерывания фреймворка в своей функции обратного вызова EvtDriverDeviceAdd. Драйвер также может создавать объекты прерываний из функции обратного вызова EvtDevicePrepareHardware .
Фреймворк вызывает функцию обратного вызова EvtDriverDeviceAdd до того, как менеджер Plug and Play (PnP) назначает системные ресурсы устройству, такие как векторы прерываний. После того, как диспетчер PnP назначает ресурсы, фреймворк сохраняет ресурсы прерывания в объекте прерывания устройства. (Драйверы, не поддерживающие Plug and Play , не могут использовать объекты прерываний.)
Чтобы создать объект прерывания платформы, драйвер должен инициализировать структуру WDF_INTERRUPT_CONFIG и передать ее в метод WdfInterruptCreate .
UMDF поддерживает следующие типы прерываний:
- Триггер уровня (общий или эксклюзивный)
- Синхронизированный по фронту (только для эксклюзивного использования)
- MSI (эксклюзивное по определению)
Заметка UMDF не поддерживает прерывания, инициируемые граничными краями.
Начиная с версии 2.15, UMDF поддерживает прерывания для простых устройств, таких как аппаратные кнопки, которые обычно реализуются с помощью контактов GPIO, и которые нельзя явно включить или отключить с помощью аппаратных регистров. Для поддержки таких устройств драйвер UMDF должен использовать монопольные прерывания, инициируемые пограничными устройствами.
Начиная с версии KMDF 1.15, KMDF также поддерживает прерывания для таких устройств без применения обходного пути, описанного в разделе "Обработка Active-Both прерываний".
Кроме того, в WDF_INTERRUPT_CONFIG драйвер предоставляет указатели на следующие функции обратного вызова событий, предоставленные драйвером:
EvtInterruptEnable
Включает аппаратное прерывание.
EvtInterruptDisable
Отключает аппаратное прерывание.
EvtInterruptIsr
Подпрограмма службы прерывания (ISR) для прерывания.
EvtInterruptDpc
Отложенный вызов процедуры (DPC) для прерывания.
EvtInterruptWorkItem
Рабочий элемент для прерывания пассивного уровня.
Для драйверов, использующих фреймворк версии 1.11 или более поздней на операционной системе Windows 8 или более поздней версии, драйвер может явно задать родителя объекта прерывания фреймворка (DIRQL или пассивный) в качестве объекта устройства фреймворка или объекта очереди фреймворка. Если драйвер указывает родительский объект, драйвер должен задать для элемента AutomaticSerialization структуры объекта прерывания WDF_INTERRUPT_CONFIG значение TRUE. Помните, что если AutomaticSerialization имеет значение TRUE, платформа синхронизирует выполнение функции обратного вызова EvtInterruptDpc или EvtInterruptWorkItem с функциями обратного вызова из других объектов, подчиненных родительскому объекту прерывания.
Например, драйвер может указать очередь как родитель прерывания для синхронизации обратных вызовов очереди с обратным вызовом EvtInterruptDpc или EvtInterruptWorkItem. В этой конфигурации платформа удаляет объект очереди при удалении объекта устройства.
После вызова WdfInterruptCreate драйвер может при необходимости вызывать WdfInterruptSetPolicy или WdfInterruptSetExtendedPolicy, чтобы указать дополнительные параметры прерывания. Обычно драйвер вызывает эти методы из функции обратного вызова EvtDriverDeviceAdd .
Фреймворк автоматически удаляет прерывание перед удалением родителя прерывания. При необходимости драйвер может вызвать WdfObjectDelete , чтобы удалить прерывание в более раннее время.
Поддержка прерываний, инициируемых сообщением
Windows Vista и более поздние версии поддерживают прерывания, сигнализированные сообщением (MSIs). Чтобы операционная система поддерживала MSIs для устройства, INF-файл драйвера должен задать некоторые значения в реестре. Сведения о том, как настроить эти значения, см. в разделе "Включение прерываний, сигнализируемых сообщением, в реестре".
Драйвер должен создать объект прерывания платформы для каждого вектора прерывания или сообщения MSI, которое поддерживает устройство. Если диспетчер PnP не предоставляет устройству все ресурсы прерывания, поддерживаемые устройством, драйвер не использует дополнительные объекты прерывания и не вызывает их функции обратного вызова.
В Windows 7 операционная система не поддерживает запросы ресурсов для более чем 910 сообщений прерываний для каждой функции устройства. В Windows 8 операционная система не поддерживает запросы ресурсов на более чем 2048 прерываний для каждой функции устройства.
Если драйвер устройства превышает это ограничение, устройство может не запуститься. Чтобы работать на компьютере с множеством логических процессоров, драйвер не должен запрашивать больше чем одно прерывание для каждого процессора.
Драйвер должен работать без сбоев при перераспределении ресурсов прерываний системой, когда диспетчер PnP назначает устройству любой набор альтернативных ресурсов прерывания из списка требований к ресурсам. Например, устройству может быть назначено меньшее число прерываний сообщений, чем запросил драйвер. В худшем случае водитель должен быть готов управлять устройством только с одним линейным прерыванием.