RTC операция
Недостатком RaspberryPi является RTC (часы реального времени) с батарейным питанием. Это устройство, которое может работать независимо от основного компьютера и следить за временем, даже когда оно выключено (поэтому у него есть собственная батарея). Он может работать очень просто - к нему подключен генератор известной частоты, и при каждом импульсе генератора он будет увеличивать свой внутренний таймер / счетчик. Поскольку частота известна, легко рассчитать время на основе счетчика. Устройство также будет иметь аккумулятор, чтобы оно могло продолжать работать даже при отключенном внешнем питании.
Некоторые устройства RTC могут быть более сложными. Они могут, например, создавать прерывание на программируемой частоте или в режиме тревоги (установленное на определенное время в будущем или на определенное время каждый день и т. Д.). Это не имеет отношения к сохранению системного времени и является необязательным.
Как RTC используется
Компьютер может запросить RTC, во сколько это (или точнее - каково его значение счетчика) во время загрузки, и установить свою внутреннюю дату / время на основе этого значения. Однако теперь компьютер не будет запрашивать время RTC каждую секунду / миллисекунду / микросекунду. Вместо этого он будет запускать свои собственные часы (называемые системным временем), обычно используя собственные таймеры / счетчики. Как и в RTC, таймер / счетчик тактируется с известной частотой, поэтому легко вычислить пройденное время.
Вы можете заставить свою систему синхронизировать свои часы с устройством RTC (в обоих направлениях), но это не произойдет, пока не будет запрошено. Некоторые системы настроены на сохранение системного времени в RTC, например, при выключении или после синхронизации NTP.
Отсутствие RTC
RaspberryPi, как и многие дешевые одноплатные компьютеры, не имеет внешнего устройства RTC. Это означает, что он не может запрашивать текущее время при загрузке. Но, как уже упоминалось, это не проблема, если мы можем получить дату / время из другого источника (например, NTP). Единственным недостатком является то, что в отличие от RTC, вы не можете задать NTP при ранней загрузке (так как вам сначала нужно сетевое подключение).
Таким образом, чтобы непосредственно ответить на ваш вопрос - независимо от того, имеет ли RaspberryPi (или любой другой компьютер) RTC или нет, он будет отслеживать время, используя внутреннее устройство таймера / счетчика, которое доступно почти в каждой компьютерной системе и требуется для запуска практически любого вида. операционной системы.
Время в Linux
Пользовательские приложения в Linux могут определять так называемые calendar time
(это время в реальном мире), используя gettimeofday()
функцию, которая затем вызывает clock_gettime()
системный вызов. То, что происходит сейчас, немного сложнее из-за множества расширенных функций, которые есть у ядра Linux (таких как пространства имен и т. Д.). Но основа в том, что ядро поддерживает свое время на основе jiffies
. На самом деле это просто переменная внутри ядра (обычно 64-битная), которая считает количество тактов с момента запуска системы.
Тики генерируются аппаратным таймером с помощью interrupts
. jiffies
значение увеличивается на каждое такое прерывание. Аппаратный таймер настроен на создание таких прерываний через равные промежутки времени. Интервал настраивается во время загрузки в соответствии со значением HZ
параметра конфигурации ядра.
В любой момент времени ядро знает, сколько тиков было сгенерировано из boot ( jiffies
переменной), оно знает, сколько таких тиков генерируется каждую секунду ( HZ
опция config), поэтому оно может легко вычислить, сколько времени прошло с последней загрузки.
Итак, подведем итог - ядро спрашивает RTC
о calendar time
(также вызываемом wall clock
) при загрузке, чтобы узнать точное время запуска системы. Затем он добавляет jiffies/HZ
значение этому каждый раз, когда приложение пользователя запрашивает, во сколько оно использует clock_gettime
системный вызов.
Аппаратный таймер / счетчик
Аппаратный таймер / счетчик - очень простое устройство. У него есть счетчик, который считает свои такты. Тиковые такты обычно создаются некоторыми внешними oscillator
(электронная схема, которая производит повторяющийся сигнал) и имеют известную частоту (обычно в диапазоне от пары кГц до сотен МГц). Это означает, что мы можем легко вычислить, сколько времени прошло, разделив значение счетчика на частоту генератора.
Устройство таймера может быть запрограммировано для выполнения различных действий - оно может считать вверх и вниз, сравнивать регистр счетчика с некоторым значением. Например, он может создать внешний сигнал и начать отсчет с начала, когда регистр счетчика имеет какое-либо значение. Таким образом, вы можете настроить таймер устройства для создания такого внешнего сигнала с постоянным интервалом, который намного ниже частоты, чем генератор. Этот сигнал затем может быть использован в качестве события прерывания для CPU.
Обратите внимание, что генератор может использоваться непосредственно вместо устройства таймера. Что отличает устройство таймера / счетчика от генератора, так это то, что оно может быть запрограммировано. Таким образом, вы можете думать о таймере / счетчике как о гораздо более сложном генераторе.