共用方式為


使用定時器

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

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

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

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

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

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

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

若要停止定時器,驅動程式可以呼叫 WdfTimerStop。 驅動程式可以透過反覆啟動和停止來重複使用定時器。

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

在 1.9 版之前的 KMDF 版本中,如果您希望所有驅動程式的回呼函式在 IRQL = PASSIVE_LEVEL執行,您便無法輕易使用定時器物件。 架構會將定時器物件的 EvtTimerFunc 回呼函式作為延遲程序呼叫(DPC)來實現,並在 IRQL = DISPATCH_LEVEL 時調用。 因此,如果您希望計時器到期程式碼在 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

如需有關無喚醒定時器的詳細資訊,請參閱 No-Wake 定時器

高解析度定時器

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

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

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

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

週期(以毫秒為單位) 標準定時器 高解析度定時器

10

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

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

16

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

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

如需高解析度定時器的詳細資訊,請參閱 High-Resolution 定時器

如需定時器精確度與系統時鐘粒度相關的詳細資訊,請參閱 定時器精確度