RTC(4) | Руководство программиста Linux | RTC(4) |
rtc - часы реального времени
#include <linux/rtc.h>
int ioctl(fd, RTC_request, param);
Данное устройство представляет собой интерфейс к драйверам часов реального времени (RTC).
В большинстве компьютеров есть одни и более аппаратных часов, ведущих отчёт "обычного" времени. Они называются "часами реального времени" (Real Time Clock, RTC). Некоторые из них имеют батарею резервного питания для продолжения работы в периоды, когда компьютер выключен. В RTC часто встроены будильники и другие прерывания.
Все ПК i386 и системы с ACPI содержат RTC, которые совместимы с микросхемой Motorola MC146818 из первоначальной модели PC/AT. Сегодня такие RTC обычно встраивают в чипсет материнской платы (в южный мост), и они используют заменяемую резервную батарею (типа «таблетки»).
В системах, несовместимых с PC (например, встраиваемые системы, собираемые на процессоре "всё в одном"), используются другие варианты. Обычно, они не предоставляют таких возможностей, как RTC в PC/AT.
Не нужно путать RTC с системными часами, которые представляют собой часы, реализованные в ядре программно и используемые для работы gettimeofday(2) и time(2), а также при указании временных меток файлов и т. п. Системные часы выдают секунды и микросекунды, начиная отсчёт от эпохи POSIX: 1970-01-01 00:00:00 +0000 (UTC) (в основном, реализуется на основе таймера прерываний ведя подсчёт «мигов» (jiffy) c частотой 100, 250 или 1000 Гц). То есть, предполагается, что они показывают обычное время как и RTC.
Ключевым отличием RTC от системных часов, является то, что RTC работают даже когда система находится в состоянии пониженного энергопотребления (даже в выключенном), а для системных часов такое недоступно. До своей инициализации системные часы показывают время, прошедшее с момента запуска системы, а не с начала эпохи POSIX. Поэтому при загрузке и после восстановления из состояния пониженного энергопотребления в системных часах часто подстраивают текущее время с помощью RTC. Системам без RTC требуется установить свои системные часы с помощью других часов, возможно через сеть или ручного ввода данных.
Из RTC можно читать или писать с помощью hwclock(8) или через вызовы ioctl, перечисленные ниже.
Помимо контроля даты и времени многие RTC также позволяют генерировать прерывания
Каждый из этих источников прерываний можно включать или выключать независимо друг от друга. Во многих системах прерывание будильника можно настроить как событие пробуждения системы, для вывода системы из состояний пониженного энергопотребления таких как: ждущего режима (Suspend-to-RAM (STR), S3 в терминологии ACPI), спящего режима (hibernation, S4 в терминологии ACPI) или даже из "выключенного" состояния (S5 в терминологии ACPI). Но в некоторых системах RTC с резервной батареей не могут генерировать прерывания.
Устройство /dev/rtc (или /dev/rtc0, /dev/rtc1 и т.д.) можно открыть только один раз (до тех пор, пока не будет закрыто) и только для чтения. При вызове read(2) и select(2) вызывающий процесс блокируется до следующего приёма прерывания от RTC. После прерывания процесс может прочитать длинное целое, в котором наименее значимый байт содержит битовую маску типа произошедшего прерывания, а остальные 3 байта содержат количество прерываний, произошедших с последнего вызова read(2).
Для файловых дескрипторов, указывающих на открытые устройства RTC, доступны следующие запросы ioctl(2):
struct rtc_time { int tm_sec; int tm_min; int tm_hour; int tm_mday; int tm_mon; int tm_year; int tm_wday; /* не используется */ int tm_yday; /* не используется */ int tm_isdst; /* не используется */ };
struct rtc_wkalrm { unsigned char enabled; unsigned char pending; struct rtc_time time; };
Когда системное время ядра синхронизируется с внешним источником с помощью adjtimex(2), оно будет обновляться назначенным RTC с периодичностью каждые 11 минут. Для этого ядро на время отключает периодические прерывания; это может повлиять на программы, использующие RTC.
Эпоха RTC не имеет ничего общего с эпохой POSIX, которая используется только в системных часах.
Если год, согласно эпохи RTC и регистр года меньше чем 1970, то предполагается, что время на 100 лет позже, то есть, между 2000 и 2069 годами.
Некоторые RTC поддерживают значения «шаблона» в полях будильника, чтобы обеспечить поддержку сценариев, например периодические будильники, через первые 15 минут в начале каждого часа, или первый день каждого месяца. Но это непереносимо; переносимый код пользовательского пространства только ожидает единичное прерывание от будильника, и будет или отключать, или реинициализировать будильник после приёма.
Некоторые RTC поддерживают периодические прерывания с периодами кратными степени 2, а не дробной секунде; несколько будильников; программируемые выходные сигналы часов; энергонезависимую память; другие аппаратные свойства, для которых пока ещё не предусмотрено программного интерфейса.
date(1), adjtimex(2), gettimeofday(2), settimeofday(2), stime(2), time(2), gmtime(3), time(7), hwclock(8)
Файл Documentation/rtc.txt в дереве исходного кода ядра Linux
2017-09-15 | Linux |