RTC(4) | Linux-Programmierhandbuch | RTC(4) |
rtc - Echtzeituhr
#include <linux/rtc.h>
int ioctl(fd, RTC_request, param);
Dies ist die Schnittstelle zu Treibern für Echtzeit-Uhren (RTCs).
Die meisten Computer verfügen über eine oder mehrere Hardware-Uhren, die die aktuelle »Wanduhr«-Zeit erfassen. Diese werden als »Real Time Clocks« (RTC) bezeichnet. Eine von ihnen ist in der Regel batteriegepuffert, sodass sie die Zeit verfolgt, auch während der Computer ausgeschaltet ist. RTCs stellen oft Alarme und andere Interrupts bereit.
In allen i386-PCs und ACPI-basierten Systemen ist eine RTC eingebaut, die kompatibel zum Chip aus dem Originalen PC/AT ist, dem Motorola MC146818. Heutzutage ist solch eine RTC im Allgemeinen in den Chipsatz des Mainboards (South Bridge) integriert und nutzt eine austauschbare münzgroße Batterie.
Nicht-PC-Systeme wie beispielsweise eingebettete Systeme, die um »System-on-chip«-Prozessoren aufgebaut sind, nutzen andere Implementierungen. Üblicherweise bieten sie nicht die gleiche Funktionalität wie die RTC aus einem PC/AT.
RTCs sollten nicht mit der Systemuhr verwechselt werden. Diese ist eine Software-Uhr, die vom Kernel gepflegt wird. Er verwendet sie für die Implementierung von gettimeofday(2) und time(2) sowie für die Zeitstempel von Dateien usw. Die Systemuhr zählt Sekunden und Mikrosekunden seit einem Startpunkt, der als die »POSIX Epoch« (1970-01-01 00:00:00 +0000 (UTC)) definiert ist. (Eine verbreitete Umsetzung zählt Timer-Interrupts, einmal pro »Jiffy«, bei einer Frequenz von 100, 250 oder 1000 Hz). Das heißt, sie sollte die »Wanduhr«-Zeit angeben, wie es auch RTCS tun.
Ein wesentlicher Unterschied zwischen einer RTC und der Systemuhr ist, dass RTCs auch dann laufen, wenn sich das System in einem Zustand niedrigen Energieverbrauchs (einschließlich »ausgeschaltet«) befindet, und die Systemuhr das nicht kann. Bis sie initialisiert wird, kann die Systemuhr nur die Zeit seit Systemstart berichten … und nicht seit der POSIX-Epoche. Also wird beim Booten und nach der Rückkehr aus einem Niedrigenergie-Zustand des Systems die Systemuhr oft über eine RTC auf die aktuelle Wanduhr-Zeit gesetzt werden. Systeme ohne eine RTC müssen die Systemuhr mit einer anderen Uhr stellen, vielleicht über das Netzwerk oder durch die manuelle Eingabe der Daten.
RTCs können direkt mit den im Folgenden aufgeführten ioctl(2)-Aufrufen und mittels hwclock(8) gelesen und geschrieben werden.
Neben der Verfolgung von Zeit und Datum können viele RTCs Interrupts erzeugen
Jede dieser Interruptquellen kann separat aktiviert oder deaktiviert werden. Auf vielen Systemen kann ein solch ein Interrupt als ein Ereignis zum »Wecken« aus einem Energiesparzustand wie Suspend-to-RAM (STR, auf ACPI-Systemen S3 genannt), Hibernation (S4 auf ACPI-Systemen) oder sogar »aus« (S5) konfiguriert werden. Auf manchen Systemen kann nicht die batteriegepufferte RTC Interrupts auslösen, sondern eine andere.
Das Gerät /dev/rtc (oder /dev/rtc0, /dev/rtc1 usw.) kann nur einmal (bis es wieder geschlossen wird) und nur für einen Lesezugriff geöffnet werden. Beim Aufruf von read(2) und select(2) wird der aufrufende Prozess blockiert, bis er den nächsten Interrupt von dieser RTC empfängt. Im Anschluss an den Interrupt kann der Prozess einen »long integer« auslesen. Dessen niedrigstwertiges Byte enthält eine Bitmaske, die die Typen der aufgetretenen Interrupts codiert, während die verbleibenden 3 Bytes die Anzahl von Interrupts seit dem letzten read(2) enthalten.
Die folgenden ioctl(2)-Anfragen sind für mit RTC-Geräten verbundene Dateideskriptoren definiert:
struct rtc_time {
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday; /* nicht verwendet */
int tm_yday; /* nicht verwendet */
int tm_isdst; /* nicht verwendet */ };
struct rtc_wkalrm {
unsigned char enabled;
unsigned char pending;
struct rtc_time time; };
Wenn die Systemzeit des Kernels mittels adjtimex(2) mit einer externen Referenz synchronisiert wird, wird er eine bestimmte RTC periodisch alle 11 Minuten aktualisieren. Dafür muss der Kernel kurzzeitig periodische Interrupts ausschalten. Dadurch könnten Programme beeinträchtigt werden, die diese RTC verwenden.
Der Zeitbezugspunkt (Epoch) hat nichts mit der POSIX Epoch zu tun, die lediglich für die Systemuhr verwendet wird.
Wenn das Jahr entsprechend der RTC-Epoch und dem Jahres-Register kleiner als 1970 ist, werden 100 Jahre drauf geschlagen, also ein Jahr zwischen 2000 und 2069 angenommen.
Einige RTCs unterstützen Platzhalterwerte (wildcards) in den Alarm-Feldern, um Szenarien wie regelmäßige Alarme 15 Minuten nach jeder vollen Stunde oder am ersten Tag eines jeden Monats zu unterstützen. Die Verwendung ist nicht portabel; portabler User-Space-Code erwartet lediglich einen einzelnen Alarm-Interrupt und wird den Alarm bei Erhalt entweder deaktivieren oder neu initialisieren.
Einige RTCs unterstützen periodische Interrupts mit Zeiten, die ein Vielfaches einer Sekunde anstatt Bruchteile einer Sekunde sind; mehrere Alarme, programmierbare Ausgangs-Taktsignale; nichtflüchtigen Speicher und weitere Fähigkeiten, die derzeit nicht von dieser API zugänglich gemacht werden.
date(1), adjtimex(2), gettimeofday(2), settimeofday(2), stime(2), time(2), gmtime(3), time(7), hwclock(8)
Documentation/rtc.txt im Linux-Kernelquelltext-Verzeichnis
Diese Seite ist Teil der Veröffentlichung 5.10 des Projekts Linux-man-pages. Eine Beschreibung des Projekts, Informationen, wie Fehler gemeldet werden können sowie die aktuelle Version dieser Seite finden sich unter https://www.kernel.org/doc/man-pages/.
Die deutsche Übersetzung dieser Handbuchseite wurde von Martin Eberhard Schauer <Martin.E.Schauer@gmx.de> erstellt.
Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.
Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Übersetzer.
15. September 2017 | Linux |