从 Windows 8.1 开始,驱动程序可以使用无唤醒计时器来避免从低功率状态不必要的唤醒处理器。 通过将处理器保持低功率状态,无唤醒计时器可降低能耗,并延长平板电脑或其他移动计算机在电池充电时可以运行的时间。
仅当处理器处于活动运行状态时,计时器才能过期。 如果计时器达到处理器处于低功率状态的过期时间,并且计时器需要立即过期,计时器必须唤醒处理器。 但是,当无唤醒计时器达到其过期时间并且处理器处于低功率状态时,此计时器将等待过期,直到处理器因计时器以外的某种原因唤醒。 作为一个选项,驱动程序可以为无唤醒计时器指定最大延迟容忍度,以便在计时器过期时间后的最大延迟容忍度内,如果处理器未唤醒(出于其他原因),计时器将唤醒处理器。
驱动程序可以使用无唤醒计时器启动非关键作,这些作仅在处理器处于活动状态时才需要执行。 例如,驱动程序可以使用无唤醒计时器定期将累积状态信息从内存缓冲区刷新到文件。 此状态信息描述驱动程序仅在处理器处于活动状态时执行的处理工作。 当处理器处于低功率状态时,不会生成状态信息,并且无需唤醒处理器。
若要创建无唤醒计时器,WDM 驱动程序调用 ExAllocateTimer 例程。 在此调用中,驱动程序在 Attributes 参数中设置EX_TIMER_NO_WAKE标志位。
若要将无唤醒计时器设置为在某个适当时间过期,驱动程序将调用 ExSetTimer 例程。 在此调用中,驱动程序可以指定无唤醒计时器在到达过期时间后,在唤醒处理器之前应等待多长时间。 驱动程序将此可容忍的延迟时间写入 EXT_SET_PARAMETERS 结构的 NoWakeTolerance 成员中,然后作为输入参数传递给 ExSetTimer 例程。 如果驱动程序将 NoWakeTolerance 成员设置为特殊值EX_TIMER_UNLIMITED_TOLERANCE,计时器永远不会唤醒处理器,因此,在处理器因其他原因唤醒之前无法过期。
Kernel-Mode 驱动程序框架(KMDF)驱动程序或 User-Mode 驱动程序框架(UMDF)驱动程序可以调用 WdfTimerCreate 方法来创建无唤醒计时器。 在此调用中,驱动程序将指向 WDF_TIMER_CONFIG 结构的指针作为参数传递。 若要创建从不唤醒处理器的无唤醒计时器,驱动程序将此结构的 TolerableDelay 成员设置为 TolerableDelayUnlimited 常量。 从 Windows 8.1 和 KMDF 版本 1.13 或 UMDF 2.0 开始,支持此常量。
与可合并计时器的比较
KeSetCoalescableTimer 例程是在 Windows 7 中引入的。 此例程使驱动程序能够指定在计时器的到期时间允许多少容错。 通常,操作系统可以使用此信息将两个或多个定时器中断合并到单个中断中。 如果多个计时器的过期时间足够接近,以至于它们的容差窗口发生重叠,那么在重叠区域内的一次计时器中断可以满足所有这些计时器的计时要求。
计时器合并的主要好处是,它延长了处理器可以在计时器过期之间保持低功率状态的时间。 因此,驱动程序将计时器合并和无唤醒计时器用于类似的目的。
但是,可合并计时器的行为与无唤醒计时器的行为不同。 具体而言,仅当处理器处于低功率状态时,为无唤醒计时器指定的可容忍延迟才适用,而为可合并计时器过期指定的容差适用,而不管处理器是否处于低功率状态。 对于可合并的计时器,驱动程序可以在过期时间内增加容错量,以减少计时器唤醒处理器的可能性,但增加容错具有降低处理器处于活动状态时计时器准确性的副作用。 相比之下,为无唤醒计时器指定的可容忍延迟不会影响处理器处于活动状态时计时器的准确性。 对于许多驱动程序,无唤醒计时器可能是降低能耗的更好方法。