Files
templates/doc/setcan/protocan/GLOBAL_TIME.md
T
Andrey 2da7e7b525 feat(global-time): Добавь общие часы и порт TMS320F28335
Вынеси программные часы, коррекцию по ProtoCAN RTCSETUP и атомарную метку логгера в переносимое ядро без глобального состояния.

Подключи eCAN-A и CPU Timer2 отдельным портом F28335; зафиксируй календарные границы, переполнение, задержку RX и защиту IRQ в хостовых тестах.
2026-10-23 14:16:21 +03:00

6.6 KiB
Raw Blame History

ProtoCAN: глобальное время и завершение инициализации платы

Профиль библиотеки c/global-time. Время использует штатную команду BROADCAST RTCSETUP. Общий флаг готовности — новое соглашение этого профиля поверх DISCRETE/FLAGS; его нельзя считать уже реализованным всеми историческими приборами ProtoCAN.

Плата → верхний уровень: готовность

После успешной инициализации оборудования и параметров плата отправляет:

Поле Значение
IDE / RTR 1 / 0
Priority 1, standard
Route 1, от устройства
DeviceType / DeviceID собственный адрес платы
MsgType 0x1, DISCRETE
MsgBody 0x3000: подтип FLAGS=3, страница 0
DLC 1
DATA[0] 0x01: бит 0 означает «инициализация завершена»

Биты DATA[0] 1..7 зарезервированы нулями. Пакет не меняет локальные технологические флаги «Статус инициализации» в ОАП конкретных приборов. В этом профиле Body 0x3000, DLC1, DATA01 закреплены за общим событием готовности; приборы с другим историческим назначением этой комбинации требуют адаптера.

Для PERIPH5 / УМП1, Type1/ID5:

CAN ID 0x19513000, DLC 1, DATA 01

Плата посылает готовность хотя бы один раз, даже если успела получить broadcast ещё до завершения собственной инициализации. Пока синхронизация не получена, событие повторяется не чаще одного раза в 1000 мс. Повтор не означает новый reset; мастер может объединять несколько близких запросов в один broadcast.

Верхний уровень → все платы: дата и время

При получении готовности мастер читает свою текущую дату, формирует штатный RTCSETUP и отправляет один кадр всем узлам. Может также периодически передавать RTCSETUP для коррекции дрейфа; библиотека принимает каждый корректный пакет.

Поле Значение
IDE / RTR 1 / 0
Priority 0 или 1
Route 0, от ПМ
DeviceType / DeviceID 0 / 0, верхний уровень
MsgType 0, BROADCAST
MsgBody 0x0030: команда RTCSETUP=3, параметр=0
DLC ровно 7
DATA hour, minute, second, year−2000, month, day, weekday

Все поля двоичные, без BCD. Диапазоны: часы 0..23, минуты/секунды 0..59, год 0..99, месяц 1..12, число согласно календарю, день недели 0..6. Профиль использует 0=воскресенье, 1=понедельник; библиотека сохраняет переданную фазу недели и затем продвигает её вместе с календарём. Дата имеет приоритет для абсолютной метки; несоответствие фазы недели календарю не меняет дату.

Пример: 2026-10-19 12:34:56, понедельник:

CAN ID 0x00000030, DLC 7, DATA 0C 22 38 1A 0A 13 01

Каждая плата независимо проверяет кадр и календарь, рассчитывает смещение от своей временной базы и атомарно корректирует её. Повреждённый или чужой кадр не меняет время и качество предыдущей синхронизации. При отсутствии новых пакетов часы продолжают локальный отсчёт. Тайм-ауты основаны на независимом uptime; перевод календаря назад не удлиняет и не сокращает их.

Миллисекунды и потребители

Нулевой миллисекундной долей опорной даты считается момент RX ISR. Тики, прошедшие до обработки в main, прибавляются к присланному времени. Исходный кадр содержит только целые секунды: локальное разрешение 1 мс не означает погрешность синхронизации между платами 1 мс. Мастер выбирает общую шкалу, например UTC, и момент отправки около секундной границы. Часовой пояс, leap seconds и компенсация арбитража CAN не передаются.

Логгер снимает gt_stamp с секундами от 2000 года, миллисекундной долей, признаком синхронизации, номером коррекции и независимым uptime. 64-битная календарная метка не помещается в старое 32-битное поле времени логгеров; изменение формата архива выполняет конкретное приложение.

Верхний уровень: точки подключения

gt_parse_ready() извлекает Type/ID из сообщения платы. gt_make_rtc() проверяет дату и формирует кадр с DLC7; ненулевые миллисекунды на входе отклоняются, чтобы не терять точность молча. Источник календаря, CAN-транспорт и обработчик входящего события предоставляет приложение мастера.

Для TMS320F28335 готовый порт занимает eCAN-A mailbox7/8 и по выбору CPU Timer2/INT14 либо hook существующего ISR 1 мс. Подробные порядок вызовов, требования к общему CAN ISR и проверки — в README библиотеки.