Hallo zusammen! Mal eine kleine Verständnisfrage: Wie funktionieren die Funktionen time, gmtime, mktime, localtime aus der time.h bei einem Mikrocontroller mit RTC (genau genommen bei einem STM32F407)? Danke für eure Hilfe. Viele Grüße
klaro schrieb: > Mal eine kleine Verständnisfrage: > Wie funktionieren die Funktionen time, gmtime, mktime, localtime aus der > time.h bei einem Mikrocontroller mit RTC (genau genommen bei einem > STM32F407)? Theoretisch, und häufig auch praktisch, funktionieren sie gar nicht. time.h-Funktionen müssen laut dem C-Standard bei Freestanding-Environments (Systemen ohne nennenswertes Betriebssystem) nicht unterstützt werden. Wenn time.h unterstützt wird, dann muss irgendwo eine Referenzzeit her kommen. Zum Beispiel dadurch, dass sie eingegeben wird (die Uhr in der Anwendung gestellt wird). Weiter muss, zumindest rudimentär, Zeitzoneninformation da sein (programmiert werden).
Das kommt auf den Compiler an. Wenn du den GCC-ARM-Embedded nutzt, welcher die newlibc nutzt, musst du selbst die Funktion "_gettimeofday" selbst implementieren, welche dann die RTC abfragt und die Informationen in einem Standard-Format zurückgibt. Dann kannst du time() und Konsorten aufrufen, wodurch indirekt deine _gettimeofday aufgerufen wird. Einfacher wäre es natürlich, wenn du direkt die RTC abfragst und auf die time.h verzichtest.
Bei ARM-GCC wird üblicherweise die newlib als Bibliothek benutzt. Diese hat ihre Wurzeln in (nicht-GPL-)Systembibliotheken diverse unixoider Opensource-Projekte. Das betrifft erstmal alles, was auf einem Unix im „Userland“ (also außerhalb des Kernels rein in der Bibliothek) abhandelbar ist. Die eigentliche Zeit muss man dabei über einen Syscall bereitstellen. Die newlib-Implementierung von time() sieht so aus:
1 | time_t
|
2 | _DEFUN (time, (t), |
3 | time_t * t) |
4 | {
|
5 | struct timeval now; |
6 | |
7 | if (_gettimeofday_r (_REENT, &now, NULL) >= 0) |
8 | {
|
9 | if (t) |
10 | *t = now.tv_sec; |
11 | return now.tv_sec; |
12 | }
|
13 | return -1; |
14 | }
|
d.h. sie erwartet, dass es ein _gettimeofday_r() gibt, mit dem sie die aktuelle Uhrzeit ermitteln kann. Diesen „Syscall“ muss man natürlich selbst implementieren, das ist dann die Stelle, an der auf die RTC zurückgegriffen werden kann.
Dr. Sommer schrieb: > Einfacher wäre es natürlich, wenn du direkt die RTC abfragst und > auf die time.h verzichtest. Jein. time.h bietet halt doch ne Menge Standard-Funktionen, die, sollte man viel davon nutzen wollen, nicht unbedingt selber implementieren muss. Eine _gettimeofday() implementiert sich schneller als die komplette time.h. Mal davon abgesehen dass man sich beim Portieren von Libs leichter tut wenn man hauptsächlich Standard-API benutzt. Kommt halt immer aufs konkrete Projekt drauf an.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.