Red de conocimiento informático - Material del sitio web - Cómo implementar una sincronización de software precisa utilizando el lenguaje C

Cómo implementar una sincronización de software precisa utilizando el lenguaje C

En el caso de requisitos de alta precisión, como cuando se requiere que el error no sea superior a 1 ms, se puede utilizar la función GetTickCount(). El valor de retorno de esta función es de tipo DWORD, que indica el intervalo de tiempo en ms que ha transcurrido desde que se inició la computadora. El siguiente código puede lograr una sincronización precisa de 50 ms con un error de menos de 1 ms.

//Valor inicial y valor final

DWORD dwStart, dwStop;

dwStop = GetTickCount()

while(TRUE ) {

//El último valor de parada se convierte en el nuevo valor de inicio

dwStart = dwStop;

//Agregue aquí la declaración de control correspondiente

do

{

dwStop = GetTickCount() ;

} while(dwStop - 50 < dwStart) ;

}

Microsoft proporciona soporte API subyacente para temporizadores precisos en sus Windows multimedia. El temporizador multimedia se puede utilizar para leer la hora actual del sistema con mucha precisión y para completar la llamada de un evento, función o procedimiento dentro de un intervalo de tiempo muy preciso. Utilizando la funcionalidad básica del temporizador multimedia, se puede lograr una sincronización precisa de dos maneras.

1. Utilice la función timeGetTime()

La precisión de tiempo de esta función es de nivel ms y devuelve el tiempo transcurrido desde que se inició Windows. Dado que esta función se utiliza para el control de temporización mediante consultas, se debe establecer un bucle de temporización para controlar los eventos de temporización.

2. Utilice la función timeSetEvent()

Utilice esta función para implementar llamadas periódicas a funciones. La descripción del parámetro de la función es la siguiente: uDelay: tiempo de retraso; uResolution: precisión de tiempo, el valor predeterminado en Windows es 1 ms; lpFunction: función de devolución de llamada, una función definida por el usuario, llamada regularmente; parámetro; TIME_ONESHOT: Ejecutar una vez; TIME_PERIODIC: Ejecutar periódicamente.

En aplicaciones específicas, puede llamar a la función timeSetEvent() para definir tareas que deben ejecutarse periódicamente en la función de devolución de llamada lpFunction (como: muestreo programado, control, etc.) para completar los eventos que necesitan ser procesados. Cabe señalar que el tiempo de procesamiento de la tarea no puede ser mayor que el intervalo del ciclo. Además, una vez agotado el temporizador, se debe llamar a timeKillEvent() de inmediato para liberarlo.

Para operaciones de temporización que requieren mayor precisión, se deben utilizar las funciones QueryPerformanceFrequency() y QueryPerformanceCounter(). Estas dos funciones son funciones de tiempo precisas proporcionadas por el sistema y requieren que la computadora admita temporizadores precisos en el hardware. Los prototipos de la función QueryPerformanceFrequency() y la función QueryPerformanceCounter() son los siguientes:

BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency

BOOL QueryPerformanceCounter(LARGE_INTEGER *lpCount); >

El tipo de datos LARGE_INTEGER puede ser un entero de 8 bytes de largo o una estructura de unión de dos enteros de 4 bytes de largo. Su uso específico depende de si el compilador admite 64 bits.

Antes de cronometrar, primero llame a la función QueryPerformanceFrequency() para obtener la frecuencia de reloj del temporizador interno de la máquina, y luego llame a la función QueryPerformanceCounter() antes y después de que ocurra el evento que requiere una sincronización estricta, usando dos tiempos para obtener La diferencia entre los conteos y la frecuencia del reloj se utiliza para calcular la hora precisa del evento.