Timer und gettimeofday()

TL&DR: Bei Zeitmessungen immer eine monotone Uhr verwendet werden, nicht die normale Systemzeit.

Long story:

In einem speziellen Fall einer Timer-Implementierung wurde gettimeofday() verwendet. Auf dem Entwicklungs-Rechner hat der Timer anstandslos funktioniert. Auf dem Embedded-System mit angeschlossenem GPS hat der Timer nicht gefeuert.

Grund dafür war, daß während des Hochfahrens die Zeit mehrmals gesetzt wurde. Dadurch waren die relativen Abstände der Zeitstempel nicht mehr korrekt. Speziell in dem Fall in dem die System-Zeit 60 Sekunden in die Vergangenheit gesetzt wurde war der 15 Sekunden-Timer plötzlich auf 60+15 Sekunden = 75 Sekunden terminiert.

Bei Zeitberechnungen/Timer ist man in den meisten Fällen an einer Uhr interessiert die für die Laufzeit des Programms bzw. des Systems die Zeit kontinuierlich hochzählt. Das Mittel der Wahl unter Linux ist dafür clock_gettime(CLOCK_MONOTONIC).