mikrocontroller.net

Forum: Compiler & IDEs time.h auf embedded Controller


Autor: klaro (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jack (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Dr. Sommer (Gast)
Datum:

Bewertung
2 lesenswert
nicht 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.

Autor: Jörg W. (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
1 lesenswert
nicht 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:
time_t
_DEFUN (time, (t),
        time_t * t)
{
  struct timeval now;

  if (_gettimeofday_r (_REENT, &now, NULL) >= 0)
    {
      if (t)
        *t = now.tv_sec;
      return now.tv_sec;
    }
  return -1;
}

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.

Autor: Le X. (lex_91)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.