Поддержка PTP
Обзор PTP
PTP (Precision Time Protocol — «протокол точного времени») — протокол, используемый для синхронизации часов в компьютерной сети. В локальных сетях он достигает наносекундной точности синхронизации (среднее значение смещения времени 0 нс, стандартное отклонение < 1 мкс), что обеспечивает высокую точность измерительных систем и систем управления. Наносекундная точность достигается за счет измерения времени получения и отправки пакетов PTP в специальных аппаратных блоках поддержки PTP. Для этого блоки поддержки имеют собственные аппаратные таймеры.
Чтобы минимизировать разницу времени между Master и Slave, во время PTP синхронизации подстраивается частота и изменяется время на аппаратных таймерах. Точность синхронизации зависит от точности измерения времени приема и передачи пакета PTP, и, как следствие, от точности измерения задержки на передачу пакета - Path delay.
Поддержка PTP в ОС Linux
В пространстве пользователя существуют следующие реализации PTP:
linuxptp - поддерживает программный и аппаратный PTP.
ptpd - поддерживает только программный, аппаратный PTP заявлен в будущих версиях, однако развитие утилиты остановлено.
Программный PTP не требует наличия аппаратного блока поддержки. Установка временных меток для пакетов PTP происходит программно: на точность синхронизации существенно влияют задержки между моментом получения пакета на MAC-уровне и входом в прерывание или callback-функцию, в котором временная метка будет установлена. Программная реализация позволяет добиться лишь микросекундной точности синхронизации.
При аппаратном PTP временные метки устанавливаются на MAC-уровне, поэтому на точность синхронизации
влияют только задержки передачи пакетов PTP по сети. Инфраструктура для работы с PTP таймерами
описана в документации Linux. Для получения времени от таймера PTP и его настройки используются
POSIX callback-функции: gettimex64()
, settime64()
, adjfine()
и adjtime()
, описанные
в struct ptp_clock_info
. Аппаратная реализация PTP позволяет добиться наносекундной точности
синхронизации (среднее значение смещение времени 0 нс, стандартное отклонение 125 нс, проверено на
MCom-03).
Для проставления меток времени принятых и отправленных пакетов через пользовательский сокет,
используется опция SO_TIMESTAMPING
, которая позволяет записывать метки времени в
struct skb_shared_hwtstamps
.
Поддержка PTP в MCom-03
Сетевые контроллеры GEMAC0, GEMAC1 MCom-03 имеют аппаратную поддержку PTP.
Поддерживаемые свойства и ограничения поддержки PTP в ядре Linux перечислены в Драйвер arasan-gemac.
В MCom-03 Buildroot используется пакет linuxptp, который предоставляет утилиты:
ptp4l - обменивается сообщениями с PTP-устройствами и синхронизирует таймер PTP;
phc2sys - синхронизирует системный таймер с таймером PTP, применяется только при использовании аппаратного PTP;
pmc - настраивает ptp4l в реальном времени.
Для постоянной синхронизации системных часов в фоновом процессе, в Buildroot используются
systemd-сервисы ptp4l.service
и phc2sys.service
. Сервисы по умолчанию выключены.
Для включения сервисов необходимо при прошивке образа rootfs.tar.gz
утилитой tar2dev
указать их в опции -s
:
tar2dev .... -s ptp4l,phc2sys ...
либо удалить в исходных кодах Buildroot
external-mcom03/overlay/elvees/usr/lib/systemd/system-preset/71-ptp.preset
.
Потеря точности
В случайные моменты времени возможна потеря точности синхронизации, выражается увеличением смещения относительно Master устройства > 1 с (MCOM03SW-2875). Точность синхронизации будет автоматически восстановлена через ~2 сек.
Переключение ролей Master/Slave
Контроллер не поддерживает установку временных меток одновременно на SYNC и DELAY_REQ сообщения (MCOM03-2123). Из-за этого невозможно динамически переключаться между ролями Master/Slave во время синхронизации.
Для поддержки переключения MCom-03 между ролями Slave/Master доработана утилита ptp4l (см.
buildroot/package/linuxptp/0000-add-support-for-DELAY_REQ-and-SYNC-packets-RX-filter.patch
).
Изменение в утилите ptp4l ограничивает использование виртуальных часов PTP vclock, добавленных в Linux 5.14: гонка за роль конкретного аппаратного модуля PTP между несколькими приложениями, использующими PTP.