time.h auf embedded Controller

Gast #5020391
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).
Gast #5020394
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.
Moderator Persönliche Seite #5020403
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.
#5020541
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren