Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
A partir de Windows 8.1, los controladores pueden usar las rutinas exXxxTimer para administrar temporizadores de alta resolución. La precisión de un temporizador de alta resolución solo está limitada por la resolución máxima admitida del reloj del sistema. En cambio, los temporizadores limitados a la resolución predeterminada del reloj del sistema son significativamente menos precisos.
Sin embargo, los temporizadores de alta resolución requieren que las interrupciones del reloj del sistema ocurran, al menos temporalmente, con mayor frecuencia, lo cual tiende a incrementar el consumo de energía. Por lo tanto, los controladores deben usar temporizadores de alta resolución solo cuando la precisión del temporizador es esencial y usar temporizadores de resolución predeterminados en todos los demás casos.
Para crear un temporizador de alta resolución, un controlador WDM llama a la rutina ExAllocateTimer y establece la marca EX_TIMER_HIGH_RESOLUTION en el parámetro Attributes . Cuando el controlador llama a la rutina ExSetTimer para establecer el temporizador de alta resolución, el sistema operativo aumenta la resolución del reloj del sistema, según sea necesario, para que las horas en las que el temporizador expire más precisamente se correspondan con los tiempos de expiración nominal especificados en los parámetros DueTime y Period .
Un controlador de Kernel-Mode Driver Framework (KMDF) puede llamar al método WdfTimerCreate para crear un temporizador de alta resolución. En esta llamada, el controlador pasa un puntero a una estructura WDF_TIMER_CONFIG como parámetro. Para crear un temporizador de alta resolución, el controlador establece el miembro UseHighResolutionTimer de esta estructura en TRUE. Este miembro forma parte de la estructura a partir de Windows 8.1 y KMDF versión 1.13.
Control de la precisión del temporizador
Por ejemplo, para Windows que se ejecuta en un procesador x86, el intervalo predeterminado entre los tics del reloj del sistema suele ser de aproximadamente 15 milisegundos y el intervalo mínimo entre los tics del reloj del sistema es de aproximadamente 1 milisegundos. Por lo tanto, la hora de expiración de un temporizador de resolución predeterminada (que ExAllocateTimer crea si no se establece la marca de EX_TIMER_HIGH_RESOLUTION) solo se puede controlar en unos 15 milisegundos, pero la hora de expiración de un temporizador de alta resolución se puede controlar en un milisegundo.
Si un controlador especifica un tiempo de expiración relativo para un temporizador de resolución predeterminada, el temporizador puede expirar hasta aproximadamente 15 milisegundos anteriores o posteriores a la hora de expiración especificada. Si un controlador especifica un tiempo de expiración relativo para un temporizador de alta resolución, el temporizador puede expirar tan tarde como aproximadamente un milisegundo después de la hora de expiración especificada, pero nunca expira al principio. Para obtener más información sobre la relación entre la resolución del reloj del sistema y la precisión del temporizador, consulte Precisión del temporizador.
Si no se establecen temporizadores de alta resolución, el sistema operativo normalmente ejecuta el reloj del sistema a su velocidad predeterminada. Sin embargo, si se establecen uno o varios temporizadores de alta resolución, es posible que el sistema operativo tenga que ejecutar el reloj del sistema a su velocidad máxima durante al menos una parte del tiempo antes de que expiren estos temporizadores.
Para evitar un aumento innecesario del consumo de energía, el sistema operativo ejecuta el reloj del sistema a su velocidad máxima solo cuando sea necesario para satisfacer los requisitos de tiempo de los temporizadores de alta resolución. Por ejemplo, si un temporizador de alta resolución es periódico y su período abarca varios intervalos del reloj del sistema por defecto, el sistema operativo podría hacer que el reloj del sistema funcione a su velocidad máxima solo en la parte del período del temporizador que precede inmediatamente a cada vencimiento. Para el resto del tiempo del temporizador, el reloj del sistema opera a su velocidad predeterminada.
Para evitar un consumo excesivo de energía, los controladores de software deben evitar configurar la duración de un temporizador de alta resolución con ejecución prolongada en un valor inferior al intervalo predeterminado entre los tics del reloj del sistema. De lo contrario, el sistema operativo se ve obligado a ejecutar continuamente el reloj del sistema a su velocidad máxima.
A partir de Windows 8, un controlador puede llamar a la rutina ExQueryTimerResolution para obtener el intervalo de resoluciones del temporizador compatibles con el reloj del sistema.
Comparación con ExSetTimerResolution
Un controlador puede llamar a la rutina ExSetTimerResolution para cambiar el intervalo de tiempo entre interrupciones sucesivas del reloj del sistema. Por ejemplo, un controlador puede llamar a esta rutina para cambiar el reloj del sistema de su velocidad predeterminada a su velocidad máxima para mejorar la precisión del temporizador. Sin embargo, el uso de ExSetTimerResolution tiene varias desventajas en comparación con el uso de temporizadores de alta resolución creados por ExAllocateTimer.
En primer lugar, después de llamar a ExSetTimerResolution para aumentar temporalmente la velocidad del reloj del sistema, un controlador debe llamar a ExSetTimerResolution una segunda vez para restaurar el reloj del sistema a su velocidad predeterminada. De lo contrario, el temporizador del reloj del sistema genera continuamente interrupciones a la velocidad máxima, lo que podría provocar un consumo excesivo de energía.
En segundo lugar, un controlador que usa la rutina ExSetTimerResolution no puede optimizar su uso temporal de velocidades de reloj del sistema tan eficazmente como lo hace el sistema operativo para temporizadores de alta resolución. Por lo tanto, el reloj del sistema pasa más tiempo ejecutándose a la velocidad máxima de lo estrictamente necesario.
En tercer lugar, si varios controladores usan simultáneamente ExSetTimerResolution para mejorar la precisión del temporizador, el reloj del sistema podría ejecutarse a su velocidad máxima durante largos períodos. En cambio, el sistema operativo coordina globalmente el funcionamiento de varios temporizadores de alta resolución para que el reloj del sistema se ejecute a la velocidad máxima solo cuando sea necesario para cumplir los requisitos de tiempo de estos temporizadores.
Por último, el uso de ExSetTimerResolution es intrínsecamente menos preciso que usar un temporizador de alta resolución. Después de que un controlador llame a ExSetTimerResolution para aumentar el reloj del sistema a su velocidad máxima, que suele ser aproximadamente un tic por milisegundos, el controlador podría llamar a una rutina como KeSetTimerEx para establecer el temporizador. Si, en esta llamada, el controlador especifica una hora de expiración relativa, el temporizador puede expirar hasta aproximadamente un milisegundo anterior o posterior a la hora de expiración especificada. Sin embargo, si se especifica un tiempo de expiración relativo para un temporizador de alta resolución, el temporizador puede expirar hasta aproximadamente un milisegundo más tarde que la hora de expiración especificada, pero nunca expira antes.