Вынеси программные часы, коррекцию по ProtoCAN RTCSETUP и атомарную метку логгера в переносимое ядро без глобального состояния. Подключи eCAN-A и CPU Timer2 отдельным портом F28335; зафиксируй календарные границы, переполнение, задержку RX и защиту IRQ в хостовых тестах.
98 lines
6.6 KiB
Markdown
98 lines
6.6 KiB
Markdown
# ProtoCAN: глобальное время и завершение инициализации платы
|
||
|
||
Профиль библиотеки [`c/global-time`](../../../c/global-time/README.md).
|
||
Время использует штатную команду 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:
|
||
|
||
```text
|
||
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, понедельник:
|
||
|
||
```text
|
||
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 библиотеки.
|