无唤醒功能的计时器

从 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 常量。 从 1.13 Windows 8.1 UMDF 2.0 开始支持此常量。

与可回收计时器的比较

KeSetCoalescableTimer 例程是在 Windows 7 中引入的。 此例程允许驱动程序指定计时器过期时间允许的容错量。 通常,操作系统可以使用此信息将两个或多个计时器中断集成到单个中断中。 如果多个计时器的过期时间彼此足够接近,因此容错时段重叠,则重叠区域中的单个计时器中断可以满足所有这些计时器的计时要求。

计时器并组的主要好处是它可以延长处理器在计时器过期之间保持低功率状态的时间。 因此,驱动程序出于类似目的使用计时器关闭和无唤醒计时器。

但是,可回收计时器的行为不同于无唤醒计时器。 具体而言,为无唤醒计时器指定的可容忍延迟仅在处理器位于低功率状态时适用,而为可回收计时器的过期指定的容忍度则适用,而不管处理器是否位于低功率状态。 对于可回收计时器,驱动程序可以增加过期时间中的容错量,以减少计时器唤醒处理器的可能性,但提高容错能力具有降低处理器处于活动状态时计时器准确性的副作用。 相反,为无唤醒计时器指定的可容忍延迟不会影响处理器处于活动状态时计时器的准确性。 对于许多驱动程序,无唤醒计时器可能是降低功耗的更好方法。