创建中断对象

处理设备硬件中断的 Windows 驱动程序框架(WDF)驱动程序必须为每个设备可以支持的每个中断创建框架中断对象。 在 Windows 8 或更高版本的操作系统上运行的框架版本 1.11 及更高版本中,“Kernel-Mode Driver Framework”(KMDF)和“User-Mode Driver Framework”(UMDF)驱动程序可以创建需要被动级别处理的中断对象。 但是,除非你在芯片(SoC)平台上为系统编写驱动程序,否则驱动程序应使用 DIRQL 中断对象。

驱动程序通常在其 EvtDriverDeviceAdd 回调函数中创建框架中断对象。 驱动程序还可以从其 EvtDevicePrepareHardware 回调函数创建中断对象。

框架在即插即用(PnP)管理器将系统资源(如中断向量)分配给设备之前调用驱动程序的 EvtDriverDeviceAdd 回调函数。 在 PnP 管理器分配资源后,框架会将中断资源存储在设备的中断对象中。 ( 不支持即插即用 的驱动程序无法使用中断对象。

若要创建框架中断对象,驱动程序必须初始化 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
工作项用于处理被动级中断

对于在 Windows 8 或更高版本的操作系统上使用框架版本 1.11 或更高版本的驱动程序,驱动程序可以将框架中断对象的父级(DIRQL 或被动)显式设置为框架设备对象或框架队列对象。 如果驱动程序指定父级,驱动程序必须将中断对象的WDF_INTERRUPT_CONFIG结构的 AutomaticSerialization 成员设置为 TRUE。 (回想一下,如果 AutomaticSerialization 为 TRUE,框架会将中断对象的 EvtInterruptDpcEvtInterruptWorkItem 回调函数的执行与中断父对象下的其他对象的回调函数同步执行。

例如,驱动程序可以将队列指定为中断的父级,以便将队列的回调与中断的 EvtInterruptDpcEvtInterruptWorkItem 回调同步。 在此配置中,框架在删除设备对象时删除队列对象。

调用 WdfInterruptCreate 后,驱动程序可以选择调用 WdfInterruptSetPolicyWdfInterruptSetExtendedPolicy 来指定其他中断参数。 通常,驱动程序从其 EvtDriverDeviceAdd 回调函数调用这些方法。

框架会在删除中断的父项之前自动删除中断。 (可选)驱动程序可以调用 WdfObjectDelete ,以在早期删除中断。

支持消息信号中断机制

Windows Vista 和更高版本支持消息信号中断(MSIs)。 若要使作系统支持设备的 MSIs,驱动程序的 INF 文件必须在注册表中设置一些值。 有关如何设置这些值的信息,请参阅 注册表中的“启用消息信号中断”

驱动程序应为设备支持的每个中断向量或 MSI 消息创建框架中断对象。 如果 PnP 管理器未向设备授予设备支持的所有中断资源,驱动程序不会使用额外的中断对象,也不会调用其回调函数。

在 Windows 7 中,操作系统不支持为每个设备功能请求超过 910 条中断请求的资源。 在 Windows 8 中,操作系统不支持每个设备功能超过 2,048 个中断的资源请求。

如果设备驱动程序超出此限制,设备可能无法启动。 若要在包含多个逻辑处理器的计算机中运行,驱动程序不应为每个处理器请求超过一个中断。

驱动程序必须能够在不中断的情况下容忍系统重新平衡的中断资源,其中,即插即用管理器(PnP 管理器)会根据资源需求列表为设备分配任何一组备用中断资源。 例如,设备可能被分配的消息中断数小于驱动程序所请求的数量。 在最坏的情况下,驱动程序必须准备好仅使用一个基于行的中断来操作设备。