Partilhar via


Temporizadores de alta resolução

A partir do Windows 8.1, os controladores podem utilizar as rotinas do temporizador ExXxx para gerir temporizadores de alta resolução. A precisão de um temporizador de alta resolução é limitada apenas pela resolução máxima suportada do relógio do sistema. Em contraste, os temporizadores limitados à resolução de relógio padrão do sistema são significativamente menos precisos.

No entanto, os temporizadores de alta resolução exigem que as interrupções do relógio do sistema ocorram, pelo menos temporariamente, a uma taxa mais alta, o que tende a aumentar o consumo de energia. Assim, os drivers devem usar temporizadores de alta resolução apenas quando a precisão do temporizador é essencial, e usar temporizadores de resolução padrão em todos os outros casos.

Para criar um temporizador de alta resolução, um driver WDM chama a rotina ExAllocateTimer e define o sinalizador EX_TIMER_HIGH_RESOLUTION no parâmetro Attributes . Quando o driver chama a rotina ExSetTimer para definir o temporizador de alta resolução, o sistema operacional aumenta a resolução do relógio do sistema, conforme necessário, para que os horários em que o temporizador expira correspondam com mais precisão aos tempos de expiração nominais especificados nos parâmetros DueTime e Period .

Um driver KMDF (Kernel-Mode Driver Framework) pode chamar o método WdfTimerCreate para criar um temporizador de alta resolução. Nesta chamada, o driver passa um ponteiro para uma estrutura WDF_TIMER_CONFIG como parâmetro. Para criar um temporizador de alta resolução, o driver define o membro UseHighResolutionTimer dessa estrutura como TRUE. Este membro faz parte da estrutura que começa com o Windows 8.1 e KMDF versão 1.13.

Controlar a precisão do temporizador

Por exemplo, para o Windows executado em um processador x86, o intervalo padrão entre os ticks do relógio do sistema é normalmente de cerca de 15 milissegundos e o intervalo mínimo entre os ticks do relógio do sistema é de cerca de 1 milissegundo. Assim, o tempo de expiração de um temporizador de resolução padrão (que o ExAllocateTimer cria se o sinalizador de EX_TIMER_HIGH_RESOLUTION não estiver definido) pode ser controlado apenas em cerca de 15 milissegundos, mas o tempo de expiração de um temporizador de alta resolução pode ser controlado dentro de um milissegundo.

Se um driver especificar um tempo de expiração relativo para um temporizador de resolução padrão, o temporizador poderá expirar até cerca de 15 milissegundos antes ou depois do tempo de expiração especificado. Se um driver especificar um tempo de expiração relativo para um temporizador de alta resolução, o temporizador pode expirar até cerca de um milissegundo após o tempo de expiração especificado, mas nunca expira cedo. Para obter mais informações sobre a relação entre a resolução do relógio do sistema e a precisão do temporizador, consulte Precisão do temporizador.

Se nenhum temporizador de alta resolução for definido, o sistema operacional normalmente executa o relógio do sistema em sua taxa padrão. No entanto, se um ou mais temporizadores de alta resolução estiverem definidos, o sistema operacional pode precisar executar o relógio do sistema em sua taxa máxima por pelo menos uma parte do tempo antes que esses temporizadores expirem.

Para evitar o aumento desnecessário do consumo de energia, o sistema operacional executa o relógio do sistema em sua taxa máxima apenas quando necessário para satisfazer os requisitos de temporização de temporizadores de alta resolução. Por exemplo, se um temporizador de alta resolução for periódico e o seu período se estender por vários ticks de relógio do sistema predefinidos, o sistema operativo poderá executar o relógio do sistema à sua taxa máxima apenas na parte do período do temporizador que precede imediatamente cada expiração. Para o resto do período do temporizador, o relógio do sistema funciona na sua taxa padrão.

Para evitar o consumo excessivo de energia, os condutores devem evitar definir o período de um temporizador de alta resolução de longa duração para um valor inferior ao intervalo predefinido entre os ticks do relógio do sistema. Caso contrário, o sistema operacional é forçado a executar continuamente o relógio do sistema em sua taxa máxima.

A partir do Windows 8, um driver pode chamar a rotina ExQueryTimerResolution para obter o intervalo de resoluções de temporizador suportadas pelo relógio do sistema.

Comparação com ExSetTimerResolution

Um driver pode chamar a rotina ExSetTimerResolution para alterar o intervalo de tempo entre as sucessivas interrupções do relógio do sistema. Por exemplo, um driver pode chamar essa rotina para alterar o relógio do sistema de sua taxa padrão para sua taxa máxima para melhorar a precisão do temporizador. No entanto, usar ExSetTimerResolution tem várias desvantagens em comparação com o uso de temporizadores de alta resolução criados por ExAllocateTimer.

Primeiro, depois de chamar ExSetTimerResolution para aumentar temporariamente a taxa de relógio do sistema, um driver deve chamar ExSetTimerResolution uma segunda vez para restaurar o relógio do sistema para sua taxa padrão. Caso contrário, o temporizador do relógio do sistema gera continuamente interrupções na taxa máxima, o que pode causar consumo excessivo de energia.

Em segundo lugar, um driver que usa a rotina ExSetTimerResolution não pode otimizar seu uso temporário de taxas de clock do sistema mais altas de forma tão eficaz quanto o sistema operacional faz para temporizadores de alta resolução. Assim, o relógio do sistema passa mais tempo funcionando na taxa máxima do que é estritamente necessário.

Em terceiro lugar, se vários drivers usarem simultaneamente ExSetTimerResolution para melhorar a precisão do temporizador, o relógio do sistema poderá ser executado em sua taxa máxima por longos períodos. Em contraste, o sistema operacional coordena globalmente a operação de vários temporizadores de alta resolução para que o relógio do sistema funcione na taxa máxima apenas quando necessário para atender aos requisitos de temporização desses temporizadores.

Finalmente, usar ExSetTimerResolution é inerentemente menos preciso do que usar um temporizador de alta resolução. Depois que um driver chama ExSetTimerResolution para aumentar o relógio do sistema para sua taxa máxima, que normalmente é de cerca de um tick por milissegundo, o driver pode chamar uma rotina como KeSetTimerEx para definir o temporizador. Se, nesta chamada, o driver especificar um tempo de expiração relativo, o temporizador pode expirar até cerca de um milissegundo antes ou depois do tempo de expiração especificado. No entanto, se um tempo de expiração relativo for especificado para um temporizador de alta resolução, o temporizador pode expirar até cerca de um milissegundo mais tarde do que o tempo de expiração especificado, mas nunca expira cedo.