millis() nach 49 Tagen einen overflow produziert.

Hallo,

In einer Programmier Anweisung habe ich gelesen:

„Es gibt Situationen in denen sich der µC "aufhängt", z.B. wenn millis() nach 49 Tagen einen overflow produziert“.

Tritt das „aufhängen“ auch ein, wenn man den z.B. uno jeden Abend ausschaltet und am nächsten Tag wieder einschaltet.

Gruß BJS

BJS-1952: Tritt das „aufhängen“ auch ein, wenn man den z.B. uno jeden Abend ausschaltet und am nächsten Tag wieder einschaltet.

Das hängt vom Programm ab, das tagsüber läuft. Wenn Du den µC jeden Tag aus- und wieder einschaltest, hängt er sich zumindest ganz sicher nicht wegen des 49-Tage-Überlaufs auf.

Gruß

Gregor

BJS-1952: „Es gibt Situationen in denen sich der µC "aufhängt", z.B. wenn millis() nach 49 Tagen einen overflow produziert“.

Ich würde es anders formulieren: "Es gibt Bugs, welche, erst nach 49,x Tagen Laufzeit, auffällig werden."

Tipp: Wer die Zusammenhänge kennt, wird, mit Sorgfalt und Disziplin, diese Probleme, schon im Vorfeld, vermeiden können.

BJS-1952: Hallo,

In einer Programmier Anweisung habe ich gelesen:

„Es gibt Situationen in denen sich der µC "aufhängt", z.B. wenn millis() nach 49 Tagen einen overflow produziert“.

Was passiert, wenn nach fast 50 Tagen ununterbrochener(!) Laufdauer der millis() Millisekundenzähler seit letzttem Reset überläuft, das hängt komplett vom Programm ab.

Bei Einigermaßen vernünftig geschriebenen Programmen passiert beim Überlauf von millis() gar nichts, die funktionieren einfach ganz normal weiter.

Aber selbstverständlich kann man auch fehlerhafte Programme schreiben, die sich beim Überlaufen von millis() entweder fehlerhaft verhalten oder sogar "aufhängen".

Es ist durchaus möglich, Schwachsinns-Code zu schreiben und als Programm auf ein Arduino-Board hochzuladen. Das ist aber nicht Arduino-Spezifisch. Idioten-Programme kann man auch für Windows, Linux und MAC, oder für Andoid oder Apple IOS schreiben und auf diese Systeme hochladen.

Die Software macht auf dem System immer das, was der Programmierer programmiert hat.

Und wenn der Programmierer Idiotenkram programmiert hat, dann macht die Software Idiotenkram.

Hallo Gregor,

Danke für deine kurze und präzise Antwort. Deine Antwort bringt mich in meinem Anfängerstatus weiter.

Gruß BJS

Kurzversion: Wenn man die Millis()-Abfrage richtig schreibt dann wird bei einem Überlauf alles richtig funktionieren. http://www.gammon.com.au/millis Das einzige was nicht funktioniert sind Zeiten länger als 49 Tage; Da muß man kontrollieren wie oft ein Überlauf stattgefunden hat. siehe https://www.faludi.com/2007/12/18/arduino-millis-rollover-handling/ Grüße Uwe

jurs: Und wenn der Programmierer Idiotenkram programmiert hat, dann macht die Software Idiotenkram.

Im Idiotenkram produzieren bin ich Vollprofi ;D

...nicht funktionieren Zeiten länger als 49 Tage; Da muß man kontrollieren wie oft ein Überlauf stattgefunden hat.

... zumal man solche Intervalle auch gar nicht in einerunsigned longKonstanten oder Variablen darstellen kann.

Wer wirklich eine Zeit von 1000 Tagen braucht, macht wohl zwei geschachtelte Zähler (z.B. aussen bis 1000 und innen bis 86'400'000), oder nimmt sowieso eine RTC statt millis() ;)