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

драйвер Windows framework drivers (вдф), обрабатывающий аппаратные прерывания устройства, должен создать объект прерывания платформы для каждого прерывания, которое может поддерживать каждое устройство. в платформах версии 1,11 и более поздних версий, работающих на Windows 8 или более поздних версиях операционной системы, драйверы Kernel-Mode framework (кмдф) и User-Mode driver framework (UMDF) могут создавать объекты прерываний, требующие обработки на пассивном уровне. Однако если вы не пишете драйвер для системы на платформе с микросхемами (SoC), драйвер должен использовать объекты ДИРКЛ interrupt.

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

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

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

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

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

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

Начиная с UMDF версии 2,15, UMDF поддерживает прерывания для простых устройств, таких как аппаратные принудительные кнопки, которые обычно поддерживаются ПИН-контактами GPIO, которые нельзя включить или отключить явно с помощью регистров оборудования. Для поддержки таких устройств драйвер UMDF должен использовать исключительные прерывания, активируемые с помощью краев.

Начиная с версии 1,15 КМДФ, КМДФ также поддерживает прерывания для таких устройств без обхода проблемы, описанной в разделе обработка Active-Both прерываний.

Кроме того, в WDF_INTERRUPT_CONFIGдрайвер предоставляет указатели на следующие функции обратного вызова событий, предоставляемые драйвером:

евтинтерруптенабле
Включает аппаратное прерывание.

евтинтерруптдисабле
Отключает аппаратное прерывание.

евтинтерруптиср
Процедура обработки прерываний (ISR) для прерывания.

евтинтерруптдпк
Отложенный вызов процедуры (DPC) для прерывания.

евтинтерруптворкитем
Рабочий элемент для пассивного прерывания.

для драйверов, использующих платформу версии 1,11 или более поздней версии в Windows 8 или более поздних версиях операционной системы, драйвер может явно задать родительский объект для объекта прерывания платформы (диркл или passive) как объект устройства платформы или объект очереди framework. Если драйвер определяет родительский объект, драйвер должен задать для элемента аутоматиксериализатион структуры WDF_INTERRUPT_CONFIG объекта прерывания значение true. (Помните, что если аутоматиксериализатион имеет значение true, платформа синхронизирует выполнение функции обратного вызова евтинтерруптдпк или евтинтерруптворкитем объекта прерывания с функциями обратного вызова из других объектов, находящимся под родительским объектом прерывания.)

Например, драйвер может указать очередь в качестве родителя прерывания, чтобы синхронизировать обратные вызовы очереди с помощью обратного вызова евтинтерруптдпк или евтинтерруптворкитем прерывания. В этой конфигурации платформа удаляет объект queue при удалении объекта устройства.

После вызова вдфинтеррупткреатедрайвер может также вызвать вдфинтерруптсетполици или вдфинтерруптсетекстендедполици , чтобы указать дополнительные параметры прерывания. Обычно драйвер вызывает эти методы из функции обратного вызова евтдривердевицеадд .

Платформа автоматически удаляет прерывание перед удалением родителя прерывания. При необходимости драйвер может вызвать вдфобжектделете , чтобы удалить прерывание в более раннее время.

Поддержка сигнальных прерываний

сигнальные прерывания (msi) поддерживаются начиная с Windows Vista. Чтобы операционная система поддерживала MSI для вашего устройства, INF-файл драйвера должен задать некоторые значения в реестре. Сведения о том, как задать эти значения, см. в разделе включение Message-Signaled прерываний в реестре.

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

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

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

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