¿Cómo hace Pi un seguimiento del intervalo de tiempo?

8

Según tengo entendido, se necesita RTC para realizar un seguimiento del tiempo. Sin embargo, Raspberry Pi no tiene eso y usa servidores NTP para sincronizar su tiempo.

Todo eso está bien, pero ¿cómo sabe Pi que ha transcurrido un milisegundo o un segundo? ¿Cómo es consciente Pi del paso del tiempo?

AppleGrew
fuente
RTC está realmente allí (con una batería) para cuando el Pi (o cualquier procesador) está apagado.
Pulpo
El Pi tiene un reloj interno que NTP configura cada vez que está en Internet, como usted dijo. Es un software que lo rastrea y el posterior paso del tiempo, no un RTC absoluto. Los comandos estándar de Linux pueden recuperar esa información siempre que lo necesite. Entonces, para responder a su pregunta, todo lo que "sabe" es el momento en que se configuró más recientemente, entonces, ¿cuántos ticks desde entonces? Aquí hay un artículo interesante sobre el tema. : blog.remibergsma.com/2013/05/12/…
SDsolar

Respuestas:

16

Operación RTC

Lo que le falta a RaspberryPi es un RTC (reloj en tiempo real) respaldado por batería. Es un dispositivo que puede funcionar independientemente de la computadora principal y realizar un seguimiento del tiempo que pasa incluso cuando está apagado (es por eso que tiene su propia batería). Puede funcionar de manera muy simple: tiene un oscilador de frecuencia conocido conectado y en cada pulso del oscilador, incrementará su temporizador / contador interno. Como se conoce la frecuencia, es fácil calcular el tiempo transcurrido en función del contador. El dispositivo también tendrá una batería para que pueda seguir funcionando incluso cuando la alimentación externa esté apagada.

Algunos dispositivos RTC pueden ser más sofisticados. Pueden, por ejemplo, crear una interrupción en frecuencia programable o en modo de alarma (ajustada a una hora determinada en el futuro o a una hora determinada cada día, etc.). No es relevante para mantener la hora del sistema y es opcional.

Cómo se usa el RTC

Una computadora puede preguntarle a RTC qué hora es (o más precisamente, cuál es su valor de contador) en el momento del arranque y establecer su fecha / hora interna en función de este valor. A partir de ahora, sin embargo, una computadora no le pedirá tiempo a RTC por segundo / milisegundo / microsegundo. En cambio, ejecutará su propio reloj (llamado tiempo del sistema), usualmente usando sus propios temporizadores / contadores. Al igual que en RTC, el temporizador / contador se registra con una frecuencia conocida, por lo que es fácil calcular el tiempo transcurrido.

Puede obligar a su sistema a sincronizar su reloj con el dispositivo RTC (en ambas direcciones), pero no sucederá hasta que lo solicite. Algunos sistemas están configurados para almacenar la hora del sistema en RTC cuando se apaga o después de la sincronización NTP, por ejemplo.

Falta de RTC

RaspberryPi, como muchas computadoras baratas de placa única, no tiene un dispositivo RTC externo. Esto significa que no puede pedir la hora actual en el arranque. Pero como ya se mencionó, esto no es un problema si podemos obtener la fecha / hora de otra fuente (como NTP). La única desventaja es que, a diferencia de RTC, no puede solicitar NTP en el arranque temprano (ya que primero necesita una conexión de red).

Entonces, para responder directamente a su pregunta, no importa si RaspberryPi (o cualquier otra computadora) tiene RTC o no, mantendrá un registro del tiempo utilizando un dispositivo interno de temporizador / contador que está disponible en casi todos los sistemas informáticos y se requiere para ejecutar casi cualquier tipo del sistema operativo

Tiempo en Linux

Las aplicaciones de espacio de usuario en Linux pueden determinar la llamada calendar time(que es un tiempo en el mundo real) utilizando una gettimeofday()función que luego llama a la clock_gettime()llamada del sistema. Lo que sucede ahora es un poco complicado debido a muchas características avanzadas que tiene el kernel de Linux (como espacios de nombres, etc.). Pero lo básico es que el núcleo mantiene su tiempo basado en jiffies. En realidad, es solo una variable dentro del núcleo (generalmente de 64 bits de ancho) que cuenta el número de ticks desde que se inició el sistema.

Los ticks son generados por el temporizador de hardware mediante interrupts. jiffiesel valor se incrementa en cada interrupción de este tipo. El temporizador de hardware está configurado para producir tales interrupciones a intervalos regulares. El intervalo se configura en el momento del arranque de acuerdo con un valor del HZparámetro de configuración del núcleo.

En cualquier momento, el kernel sabe cuántos ticks se generaron desde el arranque ( jiffiesvariable), sabe cuántos ticks se generan por segundo ( HZopción de configuración) para que pueda calcular fácilmente cuánto tiempo pasó desde el último arranque.

Para resumir - kernel pregunta RTCsobre calendar time(también llamado wall clock) en el arranque para que sepa lo que era el tiempo real cuando el sistema comenzó. Luego agrega jiffies/HZvalor a esto cada vez que una aplicación de espacio de usuario pregunta a qué hora está usando la clock_gettimellamada al sistema.

Temporizador de hardware / dispositivo contador

El temporizador / contador de hardware es un dispositivo muy simple. Tiene un registro de contador que cuenta sus tics de reloj. Los ticks de reloj generalmente son creados por algunos externos oscillator(un circuito electrónico que produce una señal repetitiva) y son de frecuencia conocida (generalmente van desde un par de kHz a cientos de MHz). Esto significa que podemos calcular fácilmente cuánto tiempo pasó dividiendo el valor del contador por la frecuencia del oscilador.

El dispositivo temporizador puede programarse para hacer varias cosas: puede contar hacia arriba y hacia abajo, comparar el registro del contador con algún valor. Por ejemplo, puede crear una señal externa y comenzar a contar desde el principio cuando el registro del contador tiene algún valor. De esta forma, puede configurar el dispositivo temporizador para crear dicha señal externa a intervalos constantes que es una frecuencia mucho más baja que el oscilador. Esta señal puede usarse luego como un evento de interrupción para una CPU.

Tenga en cuenta que el oscilador podría usarse directamente en lugar del dispositivo temporizador. Lo que diferencia al dispositivo temporizador / contador del oscilador es que se puede programar. Por lo tanto, puede pensar en el dispositivo temporizador / contador como un oscilador mucho más sofisticado.

Krzysztof Adamski
fuente
Hubiera sido más útil si se hubieran proporcionado más detalles sobre el temporizador interno.
Apple Creció
@AppleGrew: ¿Qué detalles le interesan?
Krzysztof Adamski
¿Puedes nombrar los temporizadores que mencionaste? Para que pueda leer más sobre ellos. Cuando busco en Google "temporizador interno de la CPU", parece que no obtengo nada relevante. No estoy seguro de qué es exactamente lo que espero aprender de eso, pero siento que todavía me falta algo de claridad.
Apple creció
@AppleGrew: agregué más información de fondo a mi pregunta. Espero que esto ayude.
Krzysztof Adamski
Por cierto, es posible que desee corregir el error tipográfico: 'chupar' en el tercer párrafo de la sección 'Tiempo en Linux'.
Apple creció
1

El reloj de la CPU se deriva de un cristal. Por lo general, puede esperar 10-20 partes por millón para la precisión del reloj (aproximadamente 5-10 minutos por año)

John La Rooy
fuente
0

De todos modos, para responder la pregunta de una manera mucho más fácil junto con instrucciones para agregar un RTC a su PI, insertaré un enlace a continuación. Dependiendo de si solo desea un método confiable además de usar la forma inet / ntp para decir la hora o necesita un método muy preciso, recomendaría ir con el RTC "Chronodot". De lo contrario, el RTC de la placa de conexión funcionaría bien y es muy fácil trabajar, todo lo que necesita para configurar es I2C para que el PI se comunique con el RTC. Información de enlace / materiales

Niz
fuente