Nach einigen (mehr oder weniger) sinnvollen Kommentaren, will ich nun auch mal eine Frage in die Runde werfen.
Es geht um den Null-Durchlauf des "millis()" Wertes. Da ich in einem Projekt mit einem Unix Timestamp arbeite, kann ich recht einfach mit dem Wert den millis() liefert rechnen. In regelmäßigen Abständen (vermutlich einmal pro Tag) wird der aktuelle Timestamp per NTP geholt. Dabei will ich dann den Wert für millis() auch gleich auf Null setzen, damit mir nicht der unweigerlich irgendwann auftretende Nulldruchlauf mitten am Tag die Zeitrechnung durcheinander bringt.
Den Wert selbst, sowie die Funktion habe ich in der Datei "wiring.c" gefunden :
volatile unsigned long timer0_millis = 0
unsigned long millis()
{
unsigned long m;
uint8_t oldSREG = SREG;
// disable interrupts while we read timer0_millis or we might get an
// inconsistent value (e.g. in the middle of a write to timer0_millis)
cli();
m = timer0_millis;
SREG = oldSREG;
return m;
}
Somit sollte eine Funktion
void resetmillis()
{
uint8_t oldSREG = SREG;
// disable interrupts while we read timer0_millis or we might get an
// inconsistent value (e.g. in the middle of a write to timer0_millis)
cli();
timer0_millis =0;
SREG = oldSREG;
}
kein Problem sein. Ein kurzes "find libraries -type f -exec grep 'millis() {} \; -print" liefert mir alle Stellen in den Libs, die auch mit dieser Funktion arbeiten. Das scheint aber nur in irgendwelchen Funktionen der Fall zu sein, daher denke ich, das ich auf der sicheren Seite bin, wenn ich den Wert von Hand auf 0 setze. (Zumal das ja irgendwann eh passiert)
Trotzdem die Frage, ob ich etwas übersehe? Fällt jemanden etwas ein, was mir auf die Füße fallen könnte?
Grüße,
Mario.