Как Пи отслеживает временной интервал?

8

Как я понимаю, RTC необходим, чтобы следить за временем. Однако Raspberry Pi этого не имеет и использует NTP-серверы для синхронизации своего времени.

Все это хорошо, но как Пи знает, что прошла одна миллисекунда или одна секунда. Как Пи узнает о времени?

AppleGrew
источник
RTC действительно есть (с батареей), когда Pi (или любой процессор) выключен.
Осьминог
Как вы сказали, Pi имеет внутренние часы, которые устанавливаются NTP, когда он находится в Интернете. Это программное обеспечение, которое отслеживает его и последующее время, а не абсолютное RTC. Стандартные команды Linux могут извлекать эту информацию в любое время. Итак, чтобы ответить на ваш вопрос, все, что он «знает», - это время, когда оно было задано совсем недавно, и сколько тиков с тех пор. Вот интересная статья на эту тему. : Blog.remibergsma.com/2013/05/12/...
SDsolar

Ответы:

16

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.

Обратите внимание, что генератор может использоваться непосредственно вместо устройства таймера. Что отличает устройство таймера / счетчика от генератора, так это то, что оно может быть запрограммировано. Таким образом, вы можете думать о таймере / счетчике как о гораздо более сложном генераторе.

Кшиштоф Адамски
источник
Было бы более полезно, если бы была предоставлена ​​более подробная информация о внутреннем таймере.
AppleGrew
@AppleGrew: Какие детали вас интересуют?
Кшиштоф Адамски
Можете ли вы назвать таймеры, которые вы упомянули? Так что я могу прочитать о них больше. Когда я гуглю "таймер внутреннего процессора", похоже, ничего не получается. Я не уверен, что именно я надеюсь извлечь из этого, но мне все еще не хватает ясности.
AppleGrew
@AppleGrew: я добавил дополнительную информацию к своему вопросу. Надеюсь это поможет.
Кшиштоф Адамски
Кстати, вы можете исправить опечатку «suck» в третьем параграфе «Time in Linux».
AppleGrew
1

Часы процессора получены из кристалла. Как правило, вы можете ожидать 10-20 частей на миллион для точности часов (около 5-10 минут в год)

Джон Ла Рой
источник
0

В любом случае, чтобы ответить на вопрос гораздо проще, вместе с инструкциями по добавлению RTC к вашему PI, я вставлю ссылку ниже. В зависимости от того, хотите ли вы просто надежный метод, кроме того, чтобы использовать способ inet / ntp для определения времени или нужен очень точный метод, я бы порекомендовал использовать RTC "Chronodot". В противном случае коммутационная плата RTC будет работать нормально, и ее будет очень легко настроить. Все, что вам нужно для настройки - это I2C, чтобы PI связывался с RTC. Ссылка Информация / материалы

Низ
источник