避免轮询设备

除非绝对必要,否则设备驱动程序应避免轮询其设备,并且绝不应使用整个时间切片进行轮询。 轮询设备是一项成本高昂的操作,它使轮询驱动程序中的任何操作系统都受计算限制。 执行大量轮询的设备驱动程序会干扰其他设备上的 I/O 操作,并会使系统速度缓慢且对用户无响应。

最近开发的设备在技术上与运行 Windows 的处理器一样先进,很少需要驱动程序来轮询其设备,以确保设备已准备好启动 I/O 操作或操作已完成。

然而,一些仍在使用的设备设计为与旧处理器配合使用,旧处理器的数据总线较窄、时钟速率慢,以及执行同步 I/O 的单用户、单任务操作系统。 此类设备可能需要轮询或其他一些等待设备更新其寄存器的方法。

尽管通过编码一个递增计数器的简单循环来解决设备速度缓慢的问题似乎是合乎逻辑的,从而在设备更新注册时“浪费”了最小间隔,但这种驱动程序不太可能跨 Windows 平台移植。 循环计数器最大值需要为每个平台自定义。 此外,如果驱动程序是使用良好的优化编译器编译的,编译器可能会删除驱动程序的计数器变量,循环 (递增的) 。

注意 如果驱动程序必须在设备硬件更新状态时停止,请遵循以下实现准则:驱动程序可以在读取设备寄存器之前调用 KeStallExecutionProcessor 。 驱动程序应尽量减少其停止的间隔,并且通常应指定一个不超过 50 微秒的停止间隔。

KeStallExecutionProcessor 间隔的粒度为 1 微秒。

如果设备经常需要超过 50 微秒来更新状态,请考虑在驱动程序中设置 设备专用线程