Forum: Compiler & IDEs time.h auf embedded Controller


von klaro (Gast)


Lesenswert?

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

von Jack (Gast)


Lesenswert?

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).

von Dr. Sommer (Gast)


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Le X. (lex_91)


Lesenswert?

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
Noch kein Account? Hier anmelden.