從 Windows 8.1 開始,驅動程式可以使用 ExXxx計時器 常式來管理高解析度計時器。 高解析度計時器的精確度僅受系統時鐘支援的最大解析度的限制。 相反地,受限於預設系統時鐘解析度的計時器,其準確度會明顯降低。
然而,高分辨率計時器要求系統時鐘中斷(至少暫時)以更高的速率發生,這往往會增加功耗。 因此,驅動程式只有在計時器精確度至關重要時才應該使用高解析度計時器,並在所有其他情況下使用預設解析度計時器。
若要建立高解析度計時器,WDM 驅動程式會呼叫 ExAllocateTimer 常式,並在 Attributes 參數中設定 EX_TIMER_HIGH_RESOLUTION 旗標。 當驅動程式呼叫 ExSetTimer 常式來設定高解析度計時器時,作業系統會視需要增加系統時鐘的解析度,讓計時器到期的時間更精確地對應至 DueTime 和 Period 參數中指定的標稱到期時間。
Kernel-Mode 驅動程式架構 (KMDF) 驅動程式可以呼叫 WdfTimerCreate 方法來建立高解析度計時器。 在此呼叫中,驅動程式會將 WDF_TIMER_CONFIG 結構的指標傳遞為參數。 若要建立高解析度計時器,驅動程式會將此結構的 UseHighResolutionTimer 成員設定為 TRUE。 此成員是從 Windows 8.1 和 KMDF 1.13 版開始的結構的一部分。
控制計時器準確度
例如,對於在 x86 處理器上執行的 Windows,系統時鐘刻度之間的預設間隔通常約為 15 毫秒,而系統時鐘刻度之間的最小間隔約為 1 毫秒。 因此,預設解析度計時器的到期時間 (如果未設定 EX_TIMER_HIGH_RESOLUTION 旗標,則 ExAllocateTimer 會建立) 只能控制為大約 15 毫秒內,但高解析度計時器的到期時間可以控制為毫秒內。
如果驅動程式指定預設解析計時器的相對到期時間,計時器最多可以比指定的到期時間早或晚約 15 毫秒到期。 如果驅動程式指定高解析度計時器的相對到期時間,計時器可以在指定的到期時間之後大約一毫秒到期,但永遠不會提前到期。 如需系統時鐘解析度與計時器精確度之間關係的詳細資訊,請參閱 計時器精確度。
如果未設定高解析度計時器,作業系統通常會以預設速率執行系統時鐘。 不過,如果設定一或多個高解析度計時器,則作業系統可能需要在這些計時器到期之前,至少在部分時間內以最大速率執行系統時鐘。
為了避免不必要地增加功耗,作業系統僅在必要時才以最大速率運行系統時鐘,以滿足高分辨率計時器的計時要求。 例如,如果高解析度計時器是週期性的,且其期間跨越數個預設系統時鐘刻度,則作業系統可能只會在緊接每個到期之前的計時器期間部分以最大速率執行系統時鐘。 在計時器期間的其餘時間裡,系統時鐘會以預設速率執行。
若要防止過多的耗電量,驅動程式應該避免將長時間執行的高解析度計時器的期間設定為小於系統時鐘刻度之間的預設間隔的值。 否則,作業系統會強制以最大速率持續執行系統時鐘。
從 Windows 8 開始,驅動程式可以呼叫 ExQueryTimerResolution 常式,以取得系統時鐘所支援的計時器解析度範圍。
與 ExSetTimerResolution 的比較
驅動程式可以呼叫 ExSetTimerResolution 常式,以變更連續系統時鐘中斷之間的時間間隔。 例如,驅動程式可以呼叫此常式,將系統時鐘從其預設速率變更為最大速率,以改善計時器精確度。 不過,與使用 ExAllocateTimer 所建立的高解析度計時器相比,使用 ExSetTimerResolution 有數個缺點。
首先,呼叫 ExSetTimerResolution 以暫時增加系統時鐘速率之後,驅動程式必須再次呼叫 ExSetTimerResolution ,才能將系統時鐘還原為其預設速率。 否則,系統時鐘計時器會以最大速率持續產生中斷,這可能會導致耗電過多。
其次,使用 ExSetTimerResolution 常式的驅動程式在暫時使用較高系統時鐘速率的優化上,無法像作業系統針對高解析度計時器所能達到的那樣有效。 因此,系統時鐘以最大速率運行的時間比絕對必要的時間還要多。
第三,如果多個驅動程式同時使用 ExSetTimerResolution 來改善計時器精確度,系統時鐘可能會長時間以最大速率執行。 相反地,作業系統會全域協調多個高解析度計時器的操作,以便系統時鐘只有在必要時才以最大速率執行,以滿足這些計時器的計時需求。
最後,使用 ExSetTimerResolution 本質上不如使用高解析度計時器的準確度。 驅動程式呼叫 ExSetTimerResolution 將系統時鐘增加至其最大速率,通常約為每毫秒一個滴答之後,驅動程式可能會呼叫例程,例如 KeSetTimerEx 來設定計時器。 如果在此呼叫中,驅動程式指定相對到期時間,計時器最多可以早於或晚於指定的到期時間約一毫秒。 不過,如果為高解析度計時器指定相對到期時間,則計時器最多可以比指定的到期時間晚約一毫秒到期,但永遠不會提前到期。