Forum: Mikrocontroller und Digitale Elektronik Timer: Zeitstempel erweitern


von Entwickler (Gast)


Lesenswert?

Hallo und guten Tag,

auch einem ARM Mikrocontroller möchte ich den Zeitstempel um den Wert 
Millisekunden erweitern. Nun gibt es vom Mikrocontrollerhersteller 
bereits Libs um den TimerTick auszulsen.

Wenn ich den TimerTick auslese erhalte ich ja immer den absoluten Wert.
Wie müsste ich das umsetzen damit ich als Zeitstempel HH:MM:SS:MM 
erhalte?

Beitrag #7333979 wurde von einem Moderator gelöscht.
von logiker (Gast)


Lesenswert?

Entwickler schrieb:
> Wie müsste ich das umsetzen damit ich als Zeitstempel HH:MM:SS:MM
> erhalte?

Einfach ein bisschen rechnen. Die Grundrechenarten wirst du
ja hoffentlich beherrschen.

Beitrag #7333987 wurde von einem Moderator gelöscht.
von Wolfgang (Gast)


Lesenswert?

Entwickler schrieb:
> Wenn ich den TimerTick auslese erhalte ich ja immer den absoluten Wert.

Das dürften eher Werte bezogen auf den letzten Resetzeitpunkt sein, weit 
weg von "absolut" und überlaufen wird der Zähler gelegentlich auch.

von Schlaumaier (Gast)


Lesenswert?

Für so ein Quatsch braucht man keine Libs.

Da die Libs eh keine Startzeit hat, wird sie voll nur millis ausgeben.

Man braucht ein Uhrenmodul am besten mit DC-Empfang. Am Anfang merkt man 
sie die Uhrzeit.

Dann einfach Millis abfragen und auf die Uhrzeit drauf rechnen. Schon 
hat man die Laufzeit in Milli-Sekunden.

Bei einer Timer-Funktion einfach ALT_millis = Millis() und nach den Ende 
die Differenz rechnen.

Entwickler Pöö :(

Beitrag #7334009 wurde von einem Moderator gelöscht.
von Wolfgang (Gast)


Lesenswert?

Schlaumaier schrieb:
> Dann einfach Millis abfragen und auf die Uhrzeit drauf rechnen. Schon
> hat man die Laufzeit in Milli-Sekunden.

... bis zum ersten Überlauf von dem mit Millis() abgefragten Zähler.

von Schlaumaier (Gast)


Lesenswert?

Wolfgang schrieb:
> ... bis zum ersten Überlauf von dem mit Millis() abgefragten Zähler.

FALSCH.

Wenn ich davon ausgehe das der Zähler überläuft kann ich das relativ 
unbegrenzt abfragen.

Ich muss nur an einer Stelle die das Programm regelmäßig aufruft, ein 
Millis gegen letzte_millis abfragen. wenn millis < letzte_millis sind, 
wird der ueberLauf um 1 erhöht. Womit ich weiß das es mind. 1 überlauf 
gab. Der Rest ist nur noch ein bisschen rechnen extra.

von Monk (roehrmond)


Lesenswert?

Schlaumaier schrieb:
> Der Rest ist nur noch ein bisschen rechnen extra.

Das erledigt die Subtraktion sogar von ganz alleine.
1
uint32_t start = millis();
2
3
tue_etwas();
4
5
uint32_t end = millis();
6
uint32_t duration = end-start;

Duration ist immer richtig, auch wenn der Timer zwischendurch (höchstens 
einmal) übergelaufen ist.

Entwickler schrieb:
> auf einem ARM Mikrocontroller möchte ich den Zeitstempel um den Wert
> Millisekunden erweitern.

Bei STM32 zählen die RTC Uhren nur Sekunden. Man kann zwar die Prescaler 
auslesen, aber auf genaue Millisekunden kommt man damit nicht. Nur so 
ungefähr.

Irgendwo habe ich mal gelesen, dass Linux und Windows beide auch keine 
exakten Millisekunden kennen. Das sieht nur so aus, wenn man sich 
Logfiles anschaut.

: Bearbeitet durch User
von Schlaumaier (Gast)


Lesenswert?

Steve van de Grens schrieb:
> Irgendwo habe ich mal gelesen, dass Linux und Windows beide auch keine
> exakten Millisekunden kennen.

Macht Sinn und wird auch NIE anders sein.

Immerhin dauert auch die Berechnung selbst einige MS. Ergo kann es 
NIEMALS 100% genau sein.

von Ralf D. (doeblitz)


Lesenswert?

Steve van de Grens schrieb:
> Irgendwo habe ich mal gelesen, dass Linux und Windows beide auch keine
> exakten Millisekunden kennen. Das sieht nur so aus, wenn man sich
> Logfiles anschaut.

Jein. Bei Linux kommt es auf Architektur und Konfiguration an. Bei i386 
(und X86_64) wurde der Jiffie-Takt mal von 100 Hz auf 1000 Hz erhöht, 
aktuell kannst du tickless (mit HPET-Support, nsec-Auflösung) oder mit 
konfigurierbarem (Kernel-Compile-Time) Jiffie-Takt (100 Hz, 250 Hz, 300 
Hz, 1000 Hz) arbeiten. ARM (um diese Architektur geht es hier ja) 
unterstützt ebenfalls HPET und tickless Kernel.

Worst-Case wäre also 100 Hz und damit eine Auflösung von 10msec. Bei 
meinem Debian-Kernel (x86) sind es 250 Hz und damit 4msec Auflösung.

Aber wenn du deinen Kern selbst baust, dann gibt es keinen Grund, warum 
du dort nicht auf 1000 Hz gehen kannst und somit für die Systemzeit 
(egal ob REALTIME oder MONOTONIC) echte Millisekunden-Auflösung 
bekommst.

Für Zeitmessungen, Timer etc. unterstützt ein System mit HPET aber 
wirklich nsec-Auflösung (64 bit) im Kernel, da hängt die Auflösung 
wirklich nur noch vom Systemtakt ab. Und bei GHz-Systemtakt bist du dann 
wirklich bei nsec-Auflösung.

von Monk (roehrmond)


Lesenswert?

Ralf D. schrieb:
> Bei meinem Debian-Kernel (x86) sind es 250 Hz und damit 4msec Auflösung.

Das ist die Zahl, die ich auch in Erinnerung habe. Aber wie wird denn 
auf einem PC die RTC Zeit um diese Millisekunden ergänzt? Vielleicht 
kann man von dem Konzept etwas übernehmen.

: Bearbeitet durch User
von Bauform B. (bauformb)


Lesenswert?

Steve van de Grens schrieb:
> Aber wie wird denn
> auf einem PC die RTC Zeit um diese Millisekunden ergänzt?

Die übliche RTC im PC ist so schlecht, dass sich das nicht lohnt. Was 
will ich mit Millisekunden, wenn die RTC nach einer Nacht um eine ganze 
Sekunde daneben liegt?

Beim Booten übernimmt der Linux-Kernel die RTC-Zeit mit 1 Sekunde 
Auflösung, die Milli-, Mikro- oder Nano-Sekunden sind erstmal Null. 
Danach wird die RTC nicht mehr benutzt -- außer, wenn die Kernel-Uhr vom 
ntpd synchronisiert wird. Dann stellt der Kernel die RTC alle 11 
Minuten. Dabei wird Auflösung von der RTC-Hardware begrenzt, theoretisch 
1/32768 Sekunde, praktisch z.B. 1/64 oder 1/8192 Sekunde.

In dem Moment geht die RTC normalerweise auf besser als 10ms genau, das 
schafft der ntpd auch über eine billige DSL-Verbindung. Im LAN oder per 
GPS kann der Fehler der Systemuhr auch auf wenige Mikrosekunden 
reduziert werden, aber die RTC schafft kaum einstellige Millisekunden.

Bei einer selbstgebauten Hardware mit ARM könnte man auch 100ns 
Auflösung und mit einem guten GPS-Empfänger unter 1µs Fehler haben. Aber 
eine RTC, die da mithalten kann, will man nicht bezahlen.

von Entwickler (Gast)


Lesenswert?

Danke an euch für euren Support.

Nach langen übergelgen brauche ich eigentlich einen Datum-Zeitstempel 
mit einer Erweiterung um den Wert Millisekunde.

Ich kann mit der TImerLib einen 64Bit Tick auslesen. Diesen werden kann 
ich auch quasi konvertieren in Millisekunde (absolut). Allerdings weiß 
ich nicht wie ich nun den Zeitstempel um den Wert Millisekunde erweitern 
könnte.
1
typedef struct TimeDate
2
{
3
  uint32_t millSec;
4
  uint8_t sec;
5
  uint8_t min;
6
  uint8_t hour;
7
  uint8_t day;
8
  uint8_t month;
9
  uint16_t year;
10
}TimeDate;

von Wolfgang (Gast)


Lesenswert?

Schlaumaier schrieb:
> FALSCH.

DOCH

Schlaumaier schrieb:
> Ich muss nur an einer Stelle die das Programm regelmäßig aufruft, ein
> Millis gegen letzte_millis abfragen.

Eben, aber nicht einfach so:

Schlaumaier schrieb:
> Dann einfach Millis abfragen und auf die Uhrzeit drauf rechnen. Schon
> hat man die Laufzeit in Milli-Sekunden.

von Entwickler (Gast)


Lesenswert?

Hi Wolfgang dein Post bringt mir nichts.

von Entwickler (Gast)


Lesenswert?

Die folgende Implementierung liefert mir auch die Millisekunden.
1
 uint64_t tick = get_tick_count64();
2
 uint32_t freq = get_timer_frequency();
3
 uint32_t time_ms = (uint32_t)(((uint64_t)((tick & 0xFFFFFFFF) * 1000)) / freq);

von Maxe (Gast)


Lesenswert?

@TE hast du denn die aktuelle Uhrzeit an Bord und in welcher Form?Wo 
kommt die Uhrzeit her?

von Entwickler (Gast)


Lesenswert?

Danke hab es nun realisiert.

von Jens G. (jensig)


Lesenswert?

Schlaumaier schrieb:
> Steve van de Grens schrieb:
>> Irgendwo habe ich mal gelesen, dass Linux und Windows beide auch keine
>> exakten Millisekunden kennen.
>
> Macht Sinn und wird auch NIE anders sein.

Ja ja, der Schlaumaier. Die Zeiten, in denen auf Intel-HW die 18Ticks/s 
das sagen hatten, sind eigentlich schon lange vorbei.

> Immerhin dauert auch die Berechnung selbst einige MS. Ergo kann es

MegaSamples, MegaSiemens, ... aber Du meintest sicherlich ms, was aber 
auch falsch wäre - eher µs oder gar ns ...
Heutezutage (naja, schon eher 2 Jahrzehnte oder so) tickt man eher im 
ns-Bereich, wenn es unbedingt sein muß. HPET wurde ja schon genannt.
Wenn man bei irgendeiner einigermaßen modernen SW Traces ziehen läßt, 
kann man etliche Trace-Records pro µs fortlaufend sehen.

> NIEMALS 100% genau sein.

Was ist schon 100%ig genau?

von Monk (roehrmond)


Lesenswert?

Events nach Zeitstempel zu sortieren ist eh problematisch.

Ich habe gerade im Elastic Search mal wieder irritierende Logmeldungen 
gesehen, deren Reihenfolge durcheinander gebracht wurde, weil sie in der 
selben ms stattfanden. Da kommt dann manchmal die Fehlermeldung "no 
record found" vor der Meldung "loading customer with ID 12345".

Andererseits brauchen wir die Sortierung nach Zeitstempel, weil wir da 
Logmeldungen von zahlreichen PODs zusammen tragen.

: Bearbeitet durch User
von Schlaumaier (Gast)


Lesenswert?

Jens G. schrieb:
> Ja ja, der Schlaumaier. Die Zeiten, in denen auf Intel-HW die 18Ticks/s
> das sagen hatten, sind eigentlich schon lange vorbei.

Ich lache morgen.

Habt ihr Superhelden auch mal an das "möchte Gern Multitasking" von 
Windows gedacht. Allein schon bis der Prg. überhaupt berechtigt ist, die 
Zeit zu messen sind schon einige MS vergangen.

Zeitmessung im MS o. kleiner Bereich ist auf ein PC ohne externe 
Hardware eh nicht möglich. Das verhindert schon sehr wirkungsvoll das 
System.

Ich hatte bei meiner Aussage eh mehr an Microcontroller gedacht, wo man 
immerhin wesentlich näher an der Hardware ist, als man es bei eine 
Windows-System je sein wird.

von Jens G. (jensig)


Lesenswert?

Schlaumaier schrieb:
> Habt ihr Superhelden auch mal an das "möchte Gern Multitasking" von
> Windows gedacht. Allein schon bis der Prg. überhaupt berechtigt ist, die
> Zeit zu messen sind schon einige MS vergangen.

... schon wieder MegaSamples ...
Aber die Timerwerte zu ermitteln geht ratzfatz - klar, auf seine 
Zeitscheibe muß der Prozess schon warten, wenn er gerade nicht dran ist. 
Aber das müssen dann nicht gezwungenermaßen ms sein, sondern können auch 
niedrige µs sein - wie bei jedem normalen Multitaskingsystem (Realtime 
OS (nicht "normale" Linuxe) sind zwar besser, können aber auch nichts 
garantieren, wenn entsprechend ausgelastet)

> Zeitmessung im MS o. kleiner Bereich ist auf ein PC ohne externe
> Hardware eh nicht möglich. Das verhindert schon sehr wirkungsvoll das
> System.

bla bla ...

> Ich hatte bei meiner Aussage eh mehr an Microcontroller gedacht, wo man

Nöö - Du hast Dich klar auf ein Windows-/Linux-spezifisches Statement 
bezogen.

: Bearbeitet durch User
von Forist (Gast)


Lesenswert?


von Ralf D. (doeblitz)


Lesenswert?

Steve van de Grens schrieb:
> Events nach Zeitstempel zu sortieren ist eh problematisch.

Kommt auf den Timestamp drauf an … ;-)

> Ich habe gerade im Elastic Search mal wieder irritierende Logmeldungen
> gesehen, deren Reihenfolge durcheinander gebracht wurde, weil sie in der
> selben ms stattfanden. Da kommt dann manchmal die Fehlermeldung "no
> record found" vor der Meldung "loading customer with ID 12345".

Für solchen Kram hatte ich normalerweise einen Preprozessor, der die 
einzelnen Zeilen derartiger Messages zusammengesetzt hat bevor sie an ES 
verfüttert wurden. Gerade bei Fehlermeldungen von Datenbanken 
(PostgresQL in meinem Fall) war das extrem hilfreich.

> Andererseits brauchen wir die Sortierung nach Zeitstempel, weil wir da
> Logmeldungen von zahlreichen PODs zusammen tragen.

rsyslogd mit Hires Timestamps liefert Mikrosekunden, da werden 
Verdrehungen schon erheblich unwahrscheinlicher. Im Zweifelsfall helfen 
Sequenznummern in den Messages (muss man halt selbst in seiner Software 
einbauen), um bei der Sortierung der Zeilen die Reihenfolge 
beizubehalten.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.