使用計時器

本主題描述如何使用架構的內建計時器支援。 它同時適用于Kernel-Mode Driver Framework (KMDF) 驅動程式,以及從第 2 版開始User-Mode Driver Framework (UMDF) 驅動程式。

架構提供 計時器物件 ,可讓驅動程式建立計時器。 在驅動程式建立計時器物件並啟動計時器時鐘之後,架構會在經過指定的時間量之後呼叫驅動程式提供的回呼函式。 您可以選擇性地設定計時器,讓架構在經過指定的時間量時重複呼叫回呼函式。

若要建立架構計時器物件,您的驅動程式必須呼叫 WdfTimerCreate 方法。 這個方法會註冊 EvtTimerFunc 回呼函式和定期時間間隔。 如果您希望架構只呼叫回呼函式一次,驅動程式會針對定期時間間隔指定零。

一般而言,您將會知道驅動程式針對每個裝置所需的計時器數目。 因此,驅動程式可以藉由在其EvtDriverDeviceAdd回呼函式中呼叫WdfTimerCreate來建立計時器物件,而且可以將計時器物件控制碼儲存在裝置或佇列物件的內容空間中。

若要啟動計時器,您的驅動程式會呼叫 WdfTimerStart,並傳遞「到期時間」。 當指定的時間量經過時,架構會啟動計時器的時鐘,並呼叫 EvtTimerFunc 回呼函式。

如果驅動程式在稱為 WdfTimerCreate時提供定期時間間隔,定時 器稱為定期計時器。 定期計時器的時鐘會在初始「到期時間」經過之後繼續執行,而架構會在經過定期時間間隔時重複呼叫驅動程式的回呼函式。 定期計時器不會自動啟動。 就像非定期計時器一樣,驅動程式在建立計時器後仍必須呼叫 WdfTimerStart ,才能第一次啟動它。

驅動程式可能會從其EvtTimerFunc回呼函式呼叫WdfTimerStart,以便在到期後重新開機非定期計時器。

若要停止計時器,驅動程式可以呼叫 WdfTimerStop。 您的驅動程式可以重複啟動和停止計時器來重複使用計時器。

當您的驅動程式建立計時器物件時,它必須指定父物件。 架構會停止計時器,並在刪除父代時刪除計時器物件。 若要取得計時器的父物件,您的驅動程式可以呼叫 WdfTimerGetParentObject

在 1.9 版之前的 KMDF 版本中,如果您希望所有驅動程式的回呼函式在 IRQL = PASSIVE_LEVEL執行,則無法輕易地使用計時器物件。 架構會將計時器物件的 EvtTimerFunc 回呼函式實作為延遲程序呼叫, (在 IRQL = DISPATCH_LEVEL呼叫的 DPC) 。 因此,如果您想要讓計時器到期程式碼在 PASSIVE_LEVEL EvtTimerFunc 回呼函式執行,必須將在 PASSIVE_LEVEL 上執行 的工作專案 排入佇列。

在 KMDF 1.9 版和更新版本中,您可以建立 被動層級計時器,這是在PASSIVE_LEVEL執行的計時器。 若要建立被動層級計時器,請在驅動程式呼叫WdfTimerCreate時指定WdfExecutionLevelPassive執行層級。 因此,架構會將 EvtTimerFunc 回呼函式實作為在 PASSIVE_LEVEL 上執行的工作專案。 請注意,被動層級計時器不能是定期計時器。

從 UMDF 2.0 版開始,架構會實作計時器物件的 EvtTimerFunc 回呼函式,作為使用者模式執行緒集區的背景工作執行緒。 因此,UMDF 驅動程式的計時器回呼函式一律會在PASSIVE_LEVEL執行。

沒有喚醒計時器

系統電源效率會由重複導致系統從低電源狀態繼續的計時器減少。 改善電池使用時間的其中一種方式是延遲非重大定期作業,而不是喚醒系統。 從Windows 8.1開始,您無法使用喚醒計時器在 KMDF 或 UMDF 驅動程式中執行這類非重大作業。 當系統處於低電源狀態時,沒有喚醒計時器不會喚醒系統。 相反地,架構會在下次系統完全開啟 S0 狀態時呼叫驅動程式的 EvtTimerFunc 回呼函式。

從 KMDF 1.13 版和 UMDF 2.0 版開始,沒有可用的喚醒計時器。

若要建立沒有喚醒計時器,請將WDF_TIMER_CONFIGTolerableDelay成員設定為TolerableDelayUnlimited

如需沒有喚醒計時器的詳細資訊,請參閱 無喚醒計時器

高解析度計時器

標準架構計時器具有符合系統時鐘刻度間隔的正確性,預設為 15.6 毫秒。 從Windows 8.1開始,您可以建立高解析度計時器。 高解析度計時器精確度為 1 毫秒。 對於需要精確且可預測的到期時間的重要作業,您可以使用高解析度計時器。 由於需要經常維護,高解析度計時器可能會導致電池使用時間降低。

高解析度計時器僅適用于 KMDF 驅動程式,從 KMDF 1.13 版開始。

若要建立高解析度計時器,請將WDF_TIMER_CONFIGUseHighResolutionTimer成員設定為WdfTrue,然後將Period值調整為所需的解析度。

下表根據驅動程式針對 Period提供的不同值,顯示計時器行為的範例。 這些範例假設系統時鐘刻度間隔為 15 毫秒。

Period,以毫秒為單位 標準計時器 高解析度計時器

10

計時器會在 0 毫秒到 25 毫秒之間到期。

計時器會在 10 毫秒之後儘快到期。

16

計時器會在 15 毫秒到 30 毫秒之間到期。

計時器會在 16 毫秒之後儘快到期。

如需高解析度計時器的詳細資訊,請參閱 高解析度計時器

如需計時器精確度如何與系統時鐘細微性相關的詳細資訊,請參閱 計時器精確度