Wie verfolgt Pi das Zeitintervall?


8

Soweit ich weiß, wird RTC benötigt, um die Zeit im Auge zu behalten. Raspberry Pi hat dies jedoch nicht und verwendet NTP-Server, um seine Zeit zu synchronisieren.

Das ist alles in Ordnung, aber woher weiß Pi, dass eine Millisekunde oder eine Sekunde vergangen ist. Wie ist sich Pi des Zeitablaufs bewusst?


RTC ist wirklich da (mit einer Batterie), wenn der Pi (oder ein Prozessor) ausgeschaltet ist.
Octopus

Der Pi verfügt über eine interne Uhr, die von NTP eingestellt wird, wenn er sich im Internet befindet, wie Sie sagten. Es ist eine Software, die den Überblick und den anschließenden Zeitablauf behält, keine absolute RTC. Die Standard-Linux-Befehle können diese Informationen jederzeit abrufen. Um Ihre Frage zu beantworten, ist alles, was es "weiß", die Zeit, als es zuletzt eingestellt wurde, dann wie viele Ticks seitdem. Hier ist ein interessanter Artikel zu diesem Thema. : blog.remibergsma.com/2013/05/12/…
SDsolar

Antworten:


16

RTC-Betrieb

Was RaspberryPi fehlt, ist eine batteriegepufferte RTC (Real Time Clock). Es ist ein Gerät, das unabhängig vom Hauptcomputer arbeiten und die verstrichene Zeit verfolgen kann, auch wenn es ausgeschaltet ist (aus diesem Grund verfügt es über einen eigenen Akku). Es kann auf sehr einfache Weise funktionieren - es ist ein bekannter Frequenzoszillator angeschlossen und bei jedem Impuls des Oszillators wird der interne Timer / Zähler erhöht. Da die Frequenz bekannt ist, ist es einfach, die verstrichene Zeit basierend auf dem Zähler zu berechnen. Das Gerät verfügt außerdem über einen Akku, sodass es auch bei ausgeschalteter externer Stromversorgung weiterarbeiten kann.

Einige RTC-Geräte sind möglicherweise anspruchsvoller. Sie können beispielsweise einen Interrupt in der programmierbaren Frequenz oder im Alarmmodus erzeugen (auf eine bestimmte Zeit in der Zukunft oder auf eine bestimmte Zeit jeden Tag usw. eingestellt). Es ist nicht relevant für die Einhaltung der Systemzeit und optional.

Wie RTC verwendet wird

Ein Computer kann RTC fragen, wie spät es ist (oder genauer gesagt, wie hoch sein Zählerwert ist), und sein internes Datum / seine interne Uhrzeit basierend auf diesem Wert einstellen. Von nun an fragt ein Computer RTC jedoch nicht mehr jede Sekunde / Millisekunde / Mikrosekunde nach der Zeit. Stattdessen wird eine eigene Uhr (Systemzeit genannt) ausgeführt, die normalerweise eigene Timer / Zähler verwendet. Genau wie bei RTC wird der Timer / Zähler mit einer bekannten Frequenz getaktet, sodass die verstrichene Zeit einfach berechnet werden kann.

Sie können Ihr System zwingen, seine Uhr mit dem RTC-Gerät zu synchronisieren (in beide Richtungen), dies geschieht jedoch erst, wenn Sie dazu aufgefordert werden. Einige Systeme sind so konfiguriert, dass sie die Systemzeit beispielsweise beim Herunterfahren oder nach der NTP-Synchronisierung in RTC speichern.

Fehlende RTC

RaspberryPi verfügt wie viele billige Single-Board-Computer nicht über ein externes RTC-Gerät. Dies bedeutet, dass beim Booten nicht nach der aktuellen Uhrzeit gefragt werden kann. Aber wie bereits erwähnt - dies ist kein Problem, wenn wir Datum / Uhrzeit von einer anderen Quelle (wie NTP) erhalten können. Der einzige Nachteil ist, dass Sie im Gegensatz zu RTC beim frühen Start nicht nach NTP fragen können (da Sie zuerst eine Netzwerkverbindung benötigen).

Um Ihre Frage direkt zu beantworten - unabhängig davon, ob RaspberryPi (oder ein anderer Computer) über RTC verfügt oder nicht, wird die Zeit mithilfe eines internen Timer- / Zählergeräts verfolgt, das in fast jedem Computersystem verfügbar ist und für die Ausführung nahezu aller Arten erforderlich ist des Betriebssystems.

Zeit unter Linux

Userspace-Anwendungen unter Linux können calendar timemithilfe einer gettimeofday()Funktion, die dann den Systemaufruf aufruft clock_gettime(), die so genannte Funktion (was in der realen Welt eine Zeit ist) bestimmen. Was jetzt passiert, ist aufgrund der vielen erweiterten Funktionen des Linux-Kernels (wie Namespaces usw.) etwas kompliziert. Aber die Grundlagen sind, dass der Kernel seine Zeit basierend auf beibehält jiffies. Es ist eigentlich nur eine Variable innerhalb des Kernels (normalerweise 64 Bit breit), die die Anzahl der Ticks seit dem Start des Systems zählt.

Ticks werden vom Hardware-Timer mittels generiert interrupts. jiffiesDer Wert wird bei jedem solchen Interrupt erhöht. Der Hardware-Timer ist so konfiguriert, dass er in regelmäßigen Abständen solche Interrupts erzeugt. Das Intervall wird beim Booten gemäß einem Wert des HZKernel- Konfigurationsparameters konfiguriert .

Zu jedem Zeitpunkt weiß der Kernel, wie viele Ticks vom Start generiert wurden ( jiffiesvariabel), er weiß, wie viele solcher Ticks pro Sekunde generiert werden ( HZKonfigurationsoption), sodass er leicht berechnen kann, wie viel Zeit vom letzten Start vergangen ist.

So zusammenzufassen - kernel fragt RTCetwa calendar time(auch wall clockbeim Booten) , so dass es weiß , was die tatsächliche Zeit war , wenn das System gestartet. Es fügt dann jiffies/HZWert dieses jedesmal , wenn ein User - Space - Anwendung fragt , was Zeit ist es mit clock_gettimeSystemaufruf.

Hardware-Timer / Zählergerät

Hardware-Timer / Zähler ist ein sehr einfaches Gerät. Es hat ein Zählerregister, das seine Taktanzeigen zählt. Takt-Ticks werden normalerweise von einem externen oscillator(einer elektronischen Schaltung, die sich wiederholende Signale erzeugt) erzeugt und haben eine bekannte Frequenz (normalerweise im Bereich von einigen kHz bis Hunderten MHz). Dies bedeutet, dass wir leicht berechnen können, wie viel Zeit vergangen ist, indem wir den Zählerwert durch die Frequenz des Oszillators dividieren.

Das Timer-Gerät kann für verschiedene Aufgaben programmiert werden - es kann nach oben und unten zählen und das Zählerregister mit einem bestimmten Wert vergleichen. Zum Beispiel kann es ein externes Signal erzeugen und von vorne beginnen zu zählen, wenn das Zählerregister einen bestimmten Wert hat. Auf diese Weise können Sie das Timer-Gerät so konfigurieren, dass ein solches externes Signal in einem konstanten Intervall erzeugt wird, das viel niedriger als der Oszillator ist. Dieses Signal kann dann als Interrupt-Ereignis für eine CPU verwendet werden.

Beachten Sie, dass der Oszillator direkt anstelle des Timer-Geräts verwendet werden kann. Was das Timer / Zähler-Gerät vom Oszillator unterscheidet, ist, dass es programmiert werden kann. Sie können sich also ein Timer / Zähler-Gerät als einen viel ausgefeilteren Oszillator vorstellen.


Es wäre hilfreicher gewesen, wenn mehr Details zum internen Timer angegeben worden wären.
AppleGrew

@AppleGrew: Für welche Details interessieren Sie sich?
Krzysztof Adamski

Können Sie die von Ihnen erwähnten Timer nennen? Damit ich mehr darüber lesen kann. Wenn ich "interner CPU-Timer" google, scheine nichts relevantes zu bekommen. Ich bin mir nicht sicher, was genau ich daraus lernen möchte, aber ich habe das Gefühl, dass mir immer noch Klarheit fehlt.
AppleGrew

@AppleGrew: Ich habe meiner Frage weitere Hintergrundinformationen hinzugefügt. Hoffe das hilft.
Krzysztof Adamski

Übrigens möchten Sie vielleicht den Tippfehler beheben - "saugen" im dritten Absatz von "Zeit unter Linux".
AppleGrew

1

Der CPU-Takt wird von einem Kristall abgeleitet. Normalerweise können Sie 10 bis 20 Teile pro Million für die Taktgenauigkeit erwarten (ca. 5 bis 10 Minuten pro Jahr).


0

Um die Frage zusammen mit Anweisungen zum Hinzufügen einer RTC zu Ihrem PI viel einfacher zu beantworten, füge ich unten einen Link ein. Je nachdem, ob Sie neben der Verwendung der inet / ntp-Methode zur Zeitangabe nur eine zuverlässige Methode wünschen oder eine sehr genaue Methode benötigen, würde ich die Verwendung der "Chronodot" -RTC empfehlen. Andernfalls würde die RTC des Breakout-Boards einwandfrei funktionieren und ist sehr einfach in Betrieb zu nehmen. Sie müssen lediglich I2C einrichten, damit der PI mit der RTC kommuniziert. Link Info / Materialien

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.