Comment Pi garde-t-il la trace de l'intervalle de temps?


8

Si je comprends bien, le RTC est nécessaire pour garder une trace du temps. Cependant, Raspberry Pi n'a pas cela et utilise des serveurs NTP pour synchroniser son heure.

Tout cela est bien, mais comment Pi sait-il qu'une milliseconde ou une seconde s'est écoulée. Comment Pi est-il au courant du temps qui passe?


Le RTC est vraiment là (avec une batterie) lorsque le Pi (ou n'importe quel processeur) est hors tension.
Octopus

Le Pi a une horloge interne qui est réglée par NTP chaque fois qu'il est sur Internet, comme vous l'avez dit. C'est un logiciel qui en garde la trace et le temps qui passe, pas un RTC absolu. Les commandes Linux standard peuvent récupérer ces informations à tout moment. Donc, pour répondre à votre question, tout ce qu'il "sait", c'est le moment où il a été défini le plus récemment puis le nombre de ticks depuis lors. Voici un article intéressant sur le sujet. : blog.remibergsma.com/2013/05/12/…
SDsolar

Réponses:


16

Fonctionnement RTC

Ce qui manque à RaspberryPi, c'est un RTC (Real Time Clock) alimenté par batterie. C'est un appareil qui peut fonctionner indépendamment de l'ordinateur principal et garder une trace du temps qui passe même lorsqu'il est éteint (c'est pourquoi il a sa propre batterie). Il peut fonctionner de manière très simple - il a un oscillateur de fréquence connu connecté et à chaque impulsion de l'oscillateur, il incrémentera son temporisateur / compteur interne. La fréquence étant connue, il est facile de calculer le temps écoulé en fonction du compteur. L'appareil sera également doté d'une batterie afin qu'il puisse continuer à fonctionner même lorsque l'alimentation externe est coupée.

Certains appareils RTC peuvent être plus sophistiqués. Ils peuvent, par exemple, créer une interruption en fréquence programmable ou en mode alarme (réglée à une certaine heure dans le futur ou à une certaine heure chaque jour, etc.). Il n'est pas pertinent pour conserver l'heure système et est facultatif.

Comment RTC est utilisé

Un ordinateur peut demander à RTC quelle heure il est (ou plus précisément - quelle est sa valeur de compteur) au démarrage et définir sa date / heure interne en fonction de cette valeur. À partir de maintenant, cependant, un ordinateur ne demandera pas de temps à RTC toutes les secondes / millisecondes / microsecondes. Au lieu de cela, il exécutera sa propre horloge (appelée heure système), en utilisant généralement ses propres minuteries / compteurs. Tout comme en RTC, le minuteur / compteur est cadencé avec une fréquence connue, il est donc facile de calculer le temps écoulé.

Vous pouvez forcer votre système à synchroniser son horloge avec le périphérique RTC (dans les deux sens), mais cela ne se produira que sur demande. Certains systèmes sont configurés pour stocker l'heure système dans RTC lors de l'arrêt ou après la synchronisation NTP, par exemple.

Absence de RTC

RaspberryPi, comme de nombreux ordinateurs monocarte bon marché, n'a pas de périphérique RTC externe. Cela signifie qu'il ne peut pas demander l'heure actuelle au démarrage. Mais comme déjà mentionné - ce n'est pas un problème si nous pouvons obtenir la date / heure à partir d'une autre source (comme NTP). Le seul inconvénient est que, contrairement à RTC, vous ne pouvez pas demander NTP au démarrage précoce (car vous avez d'abord besoin d'une connexion réseau).

Donc, pour répondre directement à votre question - peu importe si RaspberryPi (ou tout autre ordinateur) a RTC ou non, il gardera une trace du temps en utilisant un temporisateur / compteur interne qui est disponible dans presque tous les systèmes informatiques et est requis pour exécuter presque tous les types du système d'exploitation.

Temps sous Linux

Les applications de l'espace utilisateur sous Linux peuvent déterminer ce que l'on appelle calendar time(ce qui est une heure dans le monde réel) en utilisant une gettimeofday()fonction qui appelle ensuite l'appel clock_gettime()système. Ce qui se passe maintenant est un peu compliqué en raison des nombreuses fonctionnalités avancées du noyau Linux (comme les espaces de noms, etc.). Mais l'essentiel est que le noyau se base sur son temps jiffies. C'est en fait juste une variable à l'intérieur du noyau (généralement 64 bits de large) qui compte le nombre de ticks depuis le démarrage du système.

Les ticks sont générés par le temporisateur matériel au moyen de interrupts. jiffiesla valeur est incrémentée à chaque interruption. Le temporisateur matériel est configuré pour produire de telles interruptions à intervalles réguliers. L'intervalle est configuré au démarrage en fonction d'une valeur du HZparamètre de configuration du noyau.

À tout moment, le noyau sait combien de ticks ont été générés à partir du démarrage ( jiffiesvariable), il sait combien de tels ticks sont générés chaque seconde ( HZoption config) afin qu'il puisse facilement calculer le temps écoulé depuis le dernier démarrage.

Donc , pour résumer - noyau demande au RTCsujet calendar time(aussi appelé wall clock) au démarrage pour qu'il sache ce qui était le temps réel lorsque le système a commencé. Il ajoute ensuite de la jiffies/HZvaleur à chaque fois qu'une application de l'espace utilisateur demande à quelle heure elle utilise l' clock_gettimeappel système.

Minuterie / compteur matériel

Le minuteur / compteur matériel est un appareil très simple. Il a un compteur compteur qui compte ses ticks d'horloge. Les tics d'horloge sont généralement créés par des externes oscillator(un circuit électronique qui produit un signal répétitif) et sont de fréquence connue (allant généralement de quelques kHz à des centaines de MHz). Cela signifie que nous pouvons facilement calculer le temps écoulé en divisant la valeur du compteur par la fréquence de l'oscillateur.

Le minuteur peut être programmé pour faire diverses choses - il peut compter vers le haut et vers le bas, comparer le registre du compteur à une certaine valeur. Par exemple, il peut créer un signal externe et commencer à compter à partir du début lorsque le registre du compteur est à une certaine valeur. De cette façon, vous pouvez configurer le temporisateur pour créer un tel signal externe à intervalle constant qui est une fréquence beaucoup plus basse que l'oscillateur. Ce signal peut ensuite être utilisé comme événement d'interruption pour une CPU.

Notez que l'oscillateur peut être utilisé directement à la place du temporisateur. Ce qui différencie le temporisateur / compteur de l'oscillateur, c'est qu'il peut être programmé. Vous pouvez donc considérer le temporisateur / compteur comme un oscillateur beaucoup plus sophistiqué.


Il aurait été plus utile de fournir plus de détails sur la minuterie interne.
AppleGrew

@AppleGrew: Quels détails vous intéressent?
Krzysztof Adamski

Pouvez-vous nommer les minuteries que vous avez mentionnées? Pour que je puisse en savoir plus à leur sujet. Lorsque je google "timer CPU interne", ne semble pas obtenir quelque chose de pertinent. Je ne sais pas exactement ce que j'espère apprendre de cela, mais je sens que je manque encore de clarté.
AppleGrew

@AppleGrew: J'ai ajouté quelques informations supplémentaires à ma question. J'espère que cela t'aides.
Krzysztof Adamski

BTW vous voudrez peut-être corriger la faute de frappe - «sucer» dans le 3e paragraphe de la section «Time in Linux».
AppleGrew

1

L'horloge du processeur est dérivée d'un cristal. En règle générale, vous pouvez vous attendre à 10-20 parties par million pour la précision de l'horloge (environ 5-10 minutes par an)


0

Quoi qu'il en soit, pour répondre à la question de manière beaucoup plus simple avec des instructions pour ajouter un RTC à votre PI, j'insérerai un lien ci-dessous. Selon que vous souhaitiez simplement une méthode fiable en plus d'utiliser la méthode inet / ntp pour indiquer l'heure ou que vous ayez besoin d'une méthode très précise, je recommanderais d'utiliser le RTC "Chronodot". Sinon, la carte de dérivation RTC fonctionnerait bien et il est très facile de travailler, tout ce dont vous avez besoin pour la configuration est I2C pour que le PI communique avec le RTC. Lien Info / matériel

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.