Nota
L'accesso a questa pagina richiede l'autorizzazione. Puoi provare ad accedere o a cambiare directory.
L'accesso a questa pagina richiede l'autorizzazione. Puoi provare a cambiare directory.
A partire da Windows 8.1, i driver possono usare le routine ExXxxTimer per gestire timer ad alta risoluzione. L'accuratezza di un timer ad alta risoluzione è limitata solo dalla risoluzione massima supportata dell'orologio di sistema. Al contrario, i timer limitati alla risoluzione predefinita dell'orologio di sistema sono significativamente meno accurati.
Tuttavia, i timer ad alta risoluzione richiedono che le interruzioni dell'orologio di sistema si verifichino, almeno temporaneamente, a un ritmo più elevato, il che tende ad aumentare il consumo energetico. Pertanto, i driver devono usare timer ad alta risoluzione solo quando l'accuratezza del timer è essenziale e usare timer di risoluzione predefinita in tutti gli altri casi.
Per creare un timer ad alta risoluzione, un driver WDM chiama la routine ExAllocateTimer e imposta il flag EX_TIMER_HIGH_RESOLUTION nel parametro Attributes . Quando il driver chiama la routine ExSetTimer per impostare il timer ad alta risoluzione, il sistema operativo aumenta la risoluzione dell'orologio di sistema, se necessario, in modo che gli orari in cui il timer scada più precisamente corrispondono alle ore di scadenza nominale specificate nei parametri DueTime e Period .
Un driver Kernel-Mode Driver Framework (KMDF) può chiamare il metodo WdfTimerCreate per creare un timer ad alta risoluzione. In questa chiamata, il driver passa come parametro un puntatore a una struttura WDF_TIMER_CONFIG. Per creare un timer ad alta risoluzione, il driver imposta il membro UseHighResolutionTimer di questa struttura su TRUE. Questo membro fa parte della struttura a partire da Windows 8.1 e KMDF versione 1.13.
Controllo dell'accuratezza del timer
Ad esempio, per Windows in esecuzione in un processore x86, l'intervallo predefinito tra i tick di clock di sistema è in genere di circa 15 millisecondi e l'intervallo minimo tra i tick del clock di sistema è di circa 1 millisecondo. Pertanto, l'ora di scadenza di un timer di risoluzione predefinita (che ExAllocateTimer crea se il flag EX_TIMER_HIGH_RESOLUTION non è impostato) può essere controllato solo entro circa 15 millisecondi, ma la scadenza di un timer ad alta risoluzione può essere controllata in un millisecondo.
Se un driver specifica una scadenza relativa per un timer di risoluzione predefinito, il timer può scadere fino a circa 15 millisecondi prima o dopo rispetto all'ora di scadenza specificata. Se un driver specifica una scadenza relativa per un timer ad alta risoluzione, il timer può scadere fino a circa un millisecondo dopo l'ora di scadenza specificata, ma non scade mai in anticipo. Per altre informazioni sulla relazione tra la risoluzione dell'orologio di sistema e l'accuratezza del timer, vedere Accuratezza timer.
Se non vengono impostati timer ad alta risoluzione, il sistema operativo esegue in genere l'orologio di sistema alla frequenza predefinita. Tuttavia, se sono impostati uno o più timer ad alta risoluzione, il sistema operativo potrebbe dover eseguire l'orologio di sistema alla velocità massima per almeno una parte del tempo prima della scadenza di questi timer.
Per evitare un consumo di energia inutilmente crescente, il sistema operativo esegue l'orologio di sistema alla velocità massima solo quando necessario per soddisfare i requisiti di temporizzazione dei timer ad alta risoluzione. Ad esempio, se un timer ad alta risoluzione è periodico e il periodo copre diversi intervalli (tick) predefiniti dell'orologio di sistema, il sistema operativo potrebbe eseguire l'orologio di sistema alla velocità massima consentita solo nella parte del periodo del timer che precede direttamente ogni scadenza. Per il resto del periodo del timer, l'orologio di sistema funziona alla frequenza predefinita.
Per evitare un consumo eccessivo di energia, i driver devono evitare di impostare il periodo di un timer ad alta risoluzione a esecuzione prolungata su un valore minore dell'intervallo predefinito tra i tick dell'orologio di sistema. In caso contrario, il sistema operativo viene forzato a eseguire continuamente l'orologio di sistema alla velocità massima.
A partire da Windows 8, un driver può chiamare la routine ExQueryTimerResolution per ottenere l'intervallo di risoluzioni timer supportate dall'orologio di sistema.
Confronto con ExSetTimerResolution
Un driver può chiamare la routine ExSetTimerResolution per modificare l'intervallo di tempo tra gli interrupt di clock di sistema successivi. Ad esempio, un driver può chiamare questa routine per modificare l'orologio di sistema dalla frequenza predefinita alla frequenza massima per migliorare l'accuratezza del timer. Tuttavia, l'uso di ExSetTimerResolution presenta diversi svantaggi rispetto all'uso di timer ad alta risoluzione creati da ExAllocateTimer.
Prima di tutto, dopo aver chiamato ExSetTimerResolution per aumentare temporaneamente la frequenza di clock di sistema, un driver deve chiamare ExSetTimerResolution una seconda volta per ripristinare la frequenza predefinita dell'orologio di sistema. In caso contrario, il timer dell'orologio di sistema genera continuamente interruzioni alla velocità massima, che potrebbe causare un consumo eccessivo di energia.
In secondo luogo, un driver che usa la routine ExSetTimerResolution non può ottimizzare l'uso temporaneo di frequenze di clock di sistema più elevate in modo efficace come il sistema operativo per timer ad alta risoluzione. Di conseguenza, l'orologio di sistema impiega più tempo in esecuzione alla velocità massima di quanto sia strettamente necessario.
In terzo luogo, se più driver usano simultaneamente ExSetTimerResolution per migliorare l'accuratezza del timer, l'orologio di sistema potrebbe essere eseguito alla velocità massima per lunghi periodi. Al contrario, il sistema operativo coordina globalmente il funzionamento di più timer ad alta risoluzione in modo che l'orologio di sistema venga eseguito alla velocità massima solo quando necessario per soddisfare i requisiti di temporizzazione di questi timer.
Infine, l'uso di ExSetTimerResolution è intrinsecamente meno accurato rispetto all'uso di un timer ad alta risoluzione. Dopo che un driver chiama ExSetTimerResolution per aumentare il clock di sistema alla velocità massima, che in genere è circa un tick per millisecondo, il driver potrebbe chiamare una routine come KeSetTimerEx per impostare il timer. Se, in questa chiamata, il driver specifica una scadenza relativa, il timer può scadere fino a circa un millisecondo precedente o successivo rispetto all'ora di scadenza specificata. Tuttavia, se viene specificata una scadenza relativa per un timer ad alta risoluzione, il timer può scadere fino a circa un millisecondo successivo all'ora di scadenza specificata, ma non scade mai in anticipo.