Поделиться через


Создание объекта прерывания

Драйвер Windows Driver Frameworks (WDF), обрабатывающий аппаратные прерывания устройства, должен создать объект прерывания фреймворка для каждого поддерживаемого устройством прерывания. В версиях платформы начиная с 1.11, работающих на Windows 8 и позднее, драйверы Kernel-Mode Driver Framework (KMDF) и User-Mode Driver Framework (UMDF) могут создавать объекты прерывания, требующие обработки на пассивном уровне. Если вы не пишете драйвер для платформы System on a Chip (SoC), драйвер должен использовать объекты прерываний DIRQL.

Драйвер обычно создает объекты прерывания фреймворка в своей функции обратного вызова EvtDriverDeviceAdd. Драйвер также может создавать объекты прерываний из функции обратного вызова EvtDevicePrepareHardware .

Платформа вызывает функцию обратного вызова EvtDriverDeviceAdd до того, как диспетчер Plug and Play (PnP) назначит устройству системные ресурсы, такие как векторы прерывания. После того, как диспетчер PnP назначает ресурсы, фреймворк сохраняет ресурсы прерывания в объекте прерывания устройства. (Драйверы, не поддерживающие Plug and Play , не могут использовать объекты прерываний.)

Чтобы создать объект прерывания платформы, драйвер должен инициализировать структуру WDF_INTERRUPT_CONFIG и передать ее в метод WdfInterruptCreate .

UMDF поддерживает следующие типы прерываний:

  • Триггер уровня (общий или эксклюзивный)
  • Синхронизированный по фронту (только для эксклюзивного использования)
  • MSI (эксклюзивное по определению)

Заметка UMDF не поддерживает прерывания с общими пограничными триггерами.

Начиная с 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 , чтобы удалить прерывание в более раннее время.

Поддержка прерываний с сигналами сообщений

Прерывания с сигналами сообщений (MSI) поддерживаются, начиная с Windows Vista. Чтобы операционная система поддерживала MSIs для устройства, INF-файл драйвера должен задать некоторые значения в реестре. Сведения о том, как настроить эти значения, см. в разделе "Включение прерываний, сигнализируемых сообщением, в реестре".

Драйвер должен создать объект прерывания в рамках фреймворка для каждого вектора прерывания или сообщения MSI, которое может поддерживать устройство. Если диспетчер PnP не предоставляет устройству все ресурсы прерывания, которые может поддерживать устройство, то дополнительные объекты прерываний не будут использоваться, а их функции обратного вызова не будут вызываться.

В Windows 7 операционная система не поддерживает запросы ресурсов для более 910 сообщений прерываний на каждую функцию устройства. В Windows 8 операционная система не поддерживает запросы ресурсов на более чем 2048 прерываний для каждой функции устройства.

Если драйвер устройства превышает это ограничение, устройство может не запуститься. Чтобы работать на компьютере с множеством логических процессоров, драйвер не должен запрашивать больше одного прерывания на процессор.

Драйвер должен работать без сбоев при перераспределении ресурсов прерываний системой, когда диспетчер PnP назначает устройству любой набор альтернативных ресурсов прерывания из списка требований к ресурсам. Например, устройству может быть назначено меньшее число прерываний сообщений, чем запросил драйвер. В худшем случае водитель должен быть готов управлять устройством только с одним линейным прерыванием.