Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym temacie opisano sposób korzystania z wbudowanej obsługi czasomierza platformy. Dotyczy to zarówno sterowników Kernel-Mode Driver Framework (KMDF), jak i sterowników User-Mode Driver Framework (UMDF) począwszy od wersji 2.
Struktura udostępnia obiekt czasomierza , który umożliwia sterownikom tworzenie czasomierzy. Po utworzeniu obiektu czasomierza przez sterownik i uruchomieniu zegara czasomierza struktura wywołuje funkcję wywołania zwrotnego dostarczonego przez sterownik po upływie określonego czasu. Opcjonalnie sterownik może skonfigurować czasomierz tak, aby struktura wielokrotnie wywołuje funkcję wywołania zwrotnego, gdy upłynął określony czas.
Aby utworzyć obiekt timer struktury, sterownik musi wywołać metodę WdfTimerCreate. Ta metoda rejestruje funkcję wywołania zwrotnego EvtTimerFunc i okresowy przedział czasowy. Jeśli chcesz, aby framework wywołał funkcję zwrotną tylko raz, sterownik ustawia wartość zero dla interwału czasowego.
Zazwyczaj wiadomo, ile czasomierzy będą potrzebne dla każdego urządzenia. W związku z tym sterownik może tworzyć obiekty czasomierza, wywołując WdfTimerCreate w jego funkcji wywołania zwrotnego EvtDriverDeviceAdd i może przechowywać dojścia obiektów czasomierza w przestrzeni kontekstowej urządzenia lub obiektu kolejki.
Aby uruchomić timer, sterownik wywołuje WdfTimerStart, przekazując "czas docelowy". Platforma uruchamia zegar czasomierza i wywołuje funkcję wywołania zwrotnego EvtTimerFunc po upływie określonego czasu.
Jeśli sterownik podał okresowy interwał czasu, wywołując WdfTimerCreate, timer jest określany jako timer okresowy . Zegar czasomierza okresowego nadal działa po upływie początkowego "czasu ukończenia", a platforma wielokrotnie wywołuje funkcję zwrotną sterownika za każdym razem, gdy upłynie okresowy interwał czasu. Czasomierze okresowe nie są uruchamiane automatycznie. Podobnie jak czasomierze inne niż okresowe, sterownik musi nadal wywoływać WdfTimerStart po utworzeniu czasomierza, aby go uruchomić po raz pierwszy.
Sterownik może wywołać WdfTimerStart z funkcji wywołania zwrotnego EvtTimerFunc, aby ponownie uruchomić czasomierz nieokresowy po jego wygaśnięciu.
Aby zatrzymać czasomierz, sterownik może wywołać WdfTimerStop. Sterownik może ponownie używać czasomierzy, uruchamiając i zatrzymując je wielokrotnie.
Gdy sterownik tworzy obiekt czasomierza, musi określić obiekt nadrzędny. Framework zatrzymuje czasomierz i usuwa obiekt czasomierza, gdy element nadrzędny zostanie usunięty. Aby uzyskać obiekt nadrzędny obiektu czasomierza, sterownik może wywołać WdfTimerGetParentObject.
W wersjach KMDF wcześniejszych niż 1.9 nie można łatwo używać obiektów licznika czasu, jeśli wszystkie funkcje zwrotne sterownika mają działać na poziomie IRQL = PASSIVE_LEVEL. Struktura implementuje funkcję wywołania zwrotnego obiektu czasomierza EvtTimerFunc jako wywołanie procedury odroczonej (DPC), które jest wywoływane w irQL = DISPATCH_LEVEL. W związku z tym, jeśli chcesz, aby kod wygaśnięcia czasomierza był uruchamiany na poziomie PASSIVE_LEVEL, funkcja wywołania zwrotnego EvtTimerFunc musi umieścić w kolejce element roboczy , który działa na poziomie PASSIVE_LEVEL.
W usługach KMDF w wersji 1.9 lub nowszej można utworzyć czasomierze na poziomie pasywnym, które są czasomierzami uruchamianymi w PASSIVE_LEVEL. Aby utworzyć czasomierz na poziomie pasywnym, określ WdfExecutionLevelPassive poziom wykonywania, gdy sterownik wywołuje WdfTimerCreate. W związku z tym struktura implementuje funkcje wywołania zwrotnego EvtTimerFunc jako zadania robocze uruchamiane na poziomie PASSIVE_LEVEL. Należy pamiętać, że czasomierze na poziomie pasywnym nie mogą być okresowymi czasomierzami.
Począwszy od wersji 2.0 UMDF, szkielet implementuje funkcje EvtTimerFunc obiektu czasomierza jako wątki robocze z puli wątków trybu użytkownika dla funkcji zwrotnych . W związku z tym funkcje zwrotne timerów sterownika UMDF są zawsze uruchamiane na poziomie PASSIVE_LEVEL.
Brak liczników wznowienia
Wydajność zasilania systemu jest zmniejszana przez czasomierze, które wielokrotnie powodują wznowienie systemu ze stanów niskiego zużycia energii. Jednym ze sposobów poprawy czasu pracy baterii jest opóźnienie niekrytycznych okresowych operacji, a nie przebudzenie systemu. Począwszy od systemu Windows 8.1, można użyć bez czasomierzy wznawiania do wykonywania takich niekrytycznych operacji w sterowniku KMDF lub UMDF. Czasomierz bez wzbudzenia nie wybudza systemu, jeśli wygaśnie, gdy system jest w stanie niskiego poboru mocy. Zamiast tego, struktura wywołuje funkcję zwrotną EvtTimerFunc kierowcy przy następnym uruchomieniu systemu w pełnym trybie, w stanie S0.
Nie są dostępne czasomierze wznawiania począwszy od usługi KMDF w wersji 1.13 i UMDF w wersji 2.0.
Aby utworzyć timer bez wybudzania, ustaw członka TolerableDelay struktury WDF_TIMER_CONFIG na TolerableDelayUnlimited.
Aby uzyskać więcej informacji na temat braku czasomierzy wznawiania, zobacz No-Wake Timers.
Czasomierze o wysokiej rozdzielczości
Standardowe timery ramy mają dokładność zgodną z interwałem zegara systemowego, który domyślnie wynosi 15,6 milisekundy. Począwszy od systemu Windows 8.1, można utworzyć czasomierze o wysokiej rozdzielczości. Czasomierz o wysokiej rozdzielczości ma dokładność jednej milisekundy. Możesz użyć czasomierza o wysokiej rozdzielczości dla operacji krytycznej, która wymaga dokładnego, przewidywalnego czasu wygaśnięcia. W wyniku częstego serwisowania, którego wymaga, czasomierz o wysokiej rozdzielczości może spowodować zmniejszenie czasu pracy baterii.
Czasomierze o wysokiej rozdzielczości są dostępne tylko dla sterowników KMDF, począwszy od wersji KMDF 1.13.
Aby utworzyć czasomierz o wysokiej rozdzielczości, ustaw UseHighResolutionTimer elementu członkowskiego WDF_TIMER_CONFIG, aby WdfTrue, a następnie dostosować wartość okresu do żądanej rozdzielczości.
W poniższej tabeli przedstawiono przykłady zachowania czasomierza na podstawie różnych wartości podanych przez sterownik dla Okres. W tych przykładach przyjęto założenie, że interwał zegara systemowego wynosi 15 milisekund.
| Okres, w ms | Czasomierz standardowy | Czasomierz o wysokiej rozdzielczości |
|---|---|---|
10 |
Czasomierz wygasa między 0 milisekundami a 25 milisekundami. |
Czasomierz wygasa natychmiast po upływie 10 milisekund, jak to możliwe. |
16 |
Czasomierz wygasa między 15 milisekundami a 30 milisekundami. |
Czasomierz wygasa natychmiast po upływie 16 milisekund, jak to możliwe. |
Aby uzyskać więcej informacji na temat czasomierzy o wysokiej rozdzielczości, zobacz High-Resolution Czasomierze.
Aby uzyskać więcej informacji na temat tego, jak dokładność czasomierza jest powiązana z szczegółowością zegara systemowego, zobacz Dokładność czasomierza.