除非绝对必要,否则设备驱动程序应避免轮询其设备,并且不应使用整个时间切片进行轮询。 轮询设备是一项昂贵的操作,使得任何操作系统在轮询驱动程序内受计算限制。 执行大量轮询的设备驱动程序会干扰其他设备上的 I/O 操作,并使系统变得缓慢且对用户无响应。
最近开发的设备与 Windows 设计运行的处理器一样技术先进,很少需要驱动程序来轮询设备状态;要么确保设备已准备好启动 I/O 操作,要么确保操作已完成。
然而,某些仍在使用的设备旨在与旧处理器配合使用,这些处理器具有狭窄的数据总线、缓慢的时钟速率和执行同步 I/O 的单用户单任务作系统。 此类设备可能需要查询或其他一些方法来等待设备更新其寄存器数据。
尽管通过编写一个简单的递增计数器循环来解决慢速设备的问题看起来似乎合乎逻辑,以便在设备更新寄存器时“浪费”最小的时间间隔,但这样的驱动程序很可能无法在不同的 Windows 平台上移植。 循环计数器最大值需要对每个平台进行自定义。 此外,如果驱动程序是用良好的优化编译器编译的,编译器可能会删除驱动程序的计数器变量以及递增该变量的循环。
注意 如果驱动程序在设备硬件更新状态时必须停止,请遵循此实现准则:驱动程序在读取设备注册之前可以调用 KeStallExecutionProcessor 。 驱动程序应尽量减少其停止的间隔,通常应指定不超过 50 微秒的停止间隔。
KeStallExecutionProcessor 的间隔粒度为一微秒。
如果设备经常需要 50 微秒以上的更新状态,请考虑在驱动程序中设置 设备专用线程 。