Wie sich millis () auf 0 zurücksetzt

14

In der Dokumentation der millis()Funktion heißt es:

Gibt die Anzahl der Millisekunden zurück, seit das Arduino-Board das aktuelle Programm ausgeführt hat. Diese Zahl läuft nach ca. 50 Tagen über (auf Null zurück).

Wie ist das möglich? Erkennt Arduino, wenn ein millis()Überlauf auftritt, und setzt den Wert dann auf 0 zurück? Wenn ja, wie macht es das? Ich möchte nur wissen, was genau unter der Haube mit der Variablen passiert, die von der millis()Funktion zurückgegeben wird.

Programmierer
quelle

Antworten:

25

Es ist kein ausschließliches Eigentum von millis(). Jeder Zähler mit einer begrenzten Anzahl von Ziffern wird schließlich auf Null zurückgesetzt. Zum Beispiel wird ein 4-stelliger Zähler danach auf Null zurückgesetzt 9999.

Unter der Haube ist die Variable für millis()vom Typ unsigned long, 32 Bit auf dem Arduino. In diesem Fall sind die 32 Bits (binäre Nullen und Einsen) den Ziffern (0 bis 9) des Zählers ähnlich.

Das Maximum ist 11111111 11111111 11111111 11111111. Sobald Sie dort angekommen sind, millis()kehren Sie beim Hinzufügen zu Null zurück 1. Das Maximum (32 "Einsen") 2^32 - 1entspricht 4294967295dem Dezimalzahlensystem. Der Maximalwert für den Zähler beträgt daher 4.294.967.295 Millisekunden. Umgerechnet in Tage ergeben sich ca. 49,71 Tage.

tally couter

Juraj
quelle
5
Ältere Windows-Versionen haben außerdem eine Millisekundenanzahl in einer 32-Bit-Ganzzahl beibehalten, was dazu führt, dass sich viele Software nach 49 Tagen Betriebszeit nicht mehr richtig verhält.
Russell Borogove
danke JURAJ! Beantwortet einen anhaltenden Zweifel, den ich hatte. AKTUALISIERT;)
Tony Gil
PS: Ich hoffe, Sie stimmen den Änderungen zu. Ich bin der Meinung, dass sie zu Ihrer hervorragenden Antwort beitragen, indem sie ein paar Satzstrukturen klarstellen.
Tony Gil