Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Det här avsnittet beskriver hur du använder ramverkets inbyggda timerstöd. Det gäller både Kernel-Mode Driver Framework-drivrutiner (KMDF) och User-Mode DRIVER Framework-drivrutiner (UMDF) från och med version 2.
Ramverket innehåller ett timerobjekt som gör det möjligt för drivrutiner att skapa timers. När en drivrutin skapar ett timerobjekt och startar timerns klocka anropar ramverket en återanropsfunktion som tillhandahålls av drivrutinen efter att en angiven tid har förflutit. Alternativt kan drivrutinen konfigurera timern så att ramverket anropar återanropsfunktionen upprepade gånger, när en angiven tidsperiod har förflutit.
Om du vill skapa ett ramverkstimerobjekt måste drivrutinen anropa metoden WdfTimerCreate. Den här metoden registrerar en EvtTimerFunc återanropsfunktion och ett periodiskt tidsintervall. Om du bara vill att ramverket ska anropa återanropsfunktionen en gång anger drivrutinen noll för det periodiska tidsintervallet.
Vanligtvis vet du hur många timers som din drivrutin behöver för varje enhet. Därför kan drivrutinen skapa tidsinställda objekt genom att anropa WdfTimerSkapa i dess EvtDriverDeviceLägg till återanropsfunktion, och den kan lagra tidsinställda objekthandtag i en enhets- eller köobjekts kontextutrymme.
För att starta timern anropar din drivrutin WdfTimerStartoch anger en "förfallotid". Ramverket startar timerns klocka och kallar på funktionen EvtTimerFunc samtalsfunktion när den angivna tidsperioden har gått ut.
Om drivrutinen angav ett periodiskt tidsintervall när den anropade WdfTimerCreatekallas timern för en periodisk timer. En periodisk timer fortsätter att gå efter att den första förfallotiden har passerat, och ramverket anropar förarens återanropsfunktion så snart det periodiska tidsintervallet har förflutit. Periodiska timrar startar inte automatiskt. Precis som med icke-periodiska timers måste drivrutinen fortfarande anropa WdfTimerStart efter att ha skapat timern för att starta den första gången.
En drivrutin kan anropa WdfTimerStart från dess EvtTimerFunc återanropsfunktion för att starta om en icke-periodisk timer efter att den har upphört.
För att stoppa en timer kan föraren anropa WdfTimerStop. Drivrutinen kan återanvända tidsmätare genom att starta och stoppa dem upprepade gånger.
När drivrutinen skapar ett tidsinställt objekt måste den ange ett överordnat objekt. Ramverket stoppar timern och tar bort timer-objektet när föräldern tas bort. Om du vill hämta ett timerobjekts överordnade objekt kan drivrutinen anropa WdfTimerGetParentObject.
I KMDF-versioner före version 1.9 kan du inte enkelt använda tidsinställda objekt om du vill att alla drivrutins återanropsfunktioner ska köras på IRQL = PASSIVE_LEVEL. Ramverket implementerar timerobjektets EvtTimerFunc återanropsfunktion som ett anrop till uppskjuten procedur (DPC) som anropas vid IRQL = DISPATCH_LEVEL. Om du vill att timerns utgångskod ska köras på PASSIVE_LEVEL måste återanropsfunktionen EvtTimerFunc köa ett arbetsobjekt som körs på PASSIVE_LEVEL.
I KMDF-version 1.9 och senare kan du skapa timer på passiv nivå, som är timers som körs vid PASSIVE_LEVEL. Om du vill skapa en passiv-nivå timer, anger du utförandenivån till WdfExecutionLevelPassive när drivrutinen anropar WdfTimerCreate. Därför implementerar ramverket återanropsfunktionerna EvtTimerFunc som arbetsuppgifter som körs på PASSIVE_LEVEL. Observera att tidtagare på passiv nivå inte kan vara periodiska.
Från och med UMDF version 2.0 implementerar ramverket det tidsinställda objektets EvtTimerFunc återanropsfunktioner som arbetstrådar från trådpoolen i användarläge. Därför körs umdf-drivrutinens timeråteranropsfunktioner alltid på PASSIVE_LEVEL.
Inga väcktimers
Systemets energieffektivitet minskas av timers som upprepade gånger gör att systemet återupptas från lågeffektstillstånd. Ett sätt att förbättra batteritiden är att fördröja icke-kritiska periodiska åtgärder i stället för att väcka systemet. Från och med Windows 8.1 kan du använda avaktiveringstimers för att utföra sådana icke-kritiska åtgärder antingen i en KMDF- eller UMDF-drivrutin. En timer för att inte väcka systemet aktiverar inte systemet om den går ut medan systemet är i viloläge med låg strömförbrukning. I stället anropar ramverket drivrutinens EvtTimerFunc återanropsfunktion nästa gång systemet är helt på S0-tillstånd.
Inga väckningstimers är tillgängliga från och med KMDF version 1.13 och UMDF version 2.0.
För att skapa en timer utan väckning anger du medlemsattributet TolerableDelay i WDF_TIMER_CONFIG till TolerableDelayUnlimited.
Mer information om icke-aktiveringstimers finns i No-Wake Timerinställningar.
Timers med hög upplösning
Standard framework-timers har en noggrannhet som matchar systemklockans tickintervall, vilket är som standard 15,6 millisekunder. Från och med Windows 8.1 kan du skapa högupplösningstimers. En timer med hög upplösning har en noggrannhet på en millisekunder. Du kan använda en timer med hög upplösning för en kritisk åtgärd som kräver en exakt, förutsägbar förfallotid. Som ett resultat av den frekventa service som krävs kan en högupplösningstimer leda till minskad batteritid.
Högupplösningstimers är endast tillgängliga för KMDF-drivrutiner, från och med KMDF version 1.13.
Om du vill skapa en timer med hög upplösning anger du UseHighResolutionTimer medlem i WDF_TIMER_CONFIG till WdfTrueoch justerar sedan värdet Period till önskad upplösning.
I följande tabell visas exempel på timerbeteende baserat på olika värden som drivrutinen tillhandahåller för period. Dessa exempel förutsätter att systemklockans tickintervall är 15 millisekunder.
Period, i ms | Standardtimer | Timer med hög upplösning |
---|---|---|
10 |
Timern upphör att gälla mellan 0 millisekunder och 25 millisekunder. |
Timern upphör att gälla så snart efter 10 millisekunder som möjligt. |
16 |
Timern upphör att gälla mellan 15 millisekunder och 30 millisekunder. |
Timern upphör att gälla så snart efter 16 millisekunder som möjligt. |
Mer information om timers med hög upplösning finns i High-Resolution Timers.
Mer information om hur timernoggrannhet är relaterad till systemklockans kornighet finns i Timer Accuracy.