Поддержка 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.