Синхронизация времени

Платформа AAOS Software Defined Vehicle (SDV) определяет стандартные механизмы для передачи информации о времени от электронных блоков управления (ЭБУ) и стандартные поверхности для отображения информации о времени в экземплярах SDV . На этой странице представлена ​​подробная информация и рекомендации по стандарту SDV.

Архитектура часов

Платформа SDV имеет два стандартных тактовых генератора:

  • Часы UTC: это стандартные часы всемирного координированного времени (VTC). SOME/IP обычно предоставляет их от блоков управления (ЭБУ) к среде выполнения платформы. Примеры использования: проверка актуальности сертификатов, диагностика и V2X.

  • Монотонные сетевые часы: это неубывающий, высокоточный тактовый сигнал, предоставляемый блоками управления двигателем (ЭБУ), который используется всей архитектурой автомобиля для обеспечения координации событий. ЭБУ передают его платформе SDV через протокол gPTP. Эти часы также известны как стабильные часы .

В платформе SDV для работы часов предъявляются специфические архитектурные требования:

  • Передача тактового сигнала: Каждый экземпляр виртуальной машины получает доступ к одному и тому же монотонному тактовому сигналу, предоставляемому блоками управления (ECU).

  • Целостность тактового сигнала: Ожидается, что входной сигнал монотонных тактовых часов сети будет надежным источником для координации событий между сервисами. Защита от возможных системных уязвимостей, таких как атаки повторного воспроизведения или инверсия времени, основана на целостности монотонных тактовых сигналов.

  • Использование будильника: API часов платформы SDV не следует использовать для событий с высокой частотой возникновения (> 100 Гц) или задержкой менее 10 мс между временем планирования и временем события. Для API с высокой частотой или низкой задержкой следует использовать драйвер ядра.

API часов

Монотонные сетевые часы доступны через стандартный API clock_gettime(3) :

// Network monotonic clock uses standard Linux API.
// This is represented as a dynamic clock in clock_gettime(3)
clock_gettime(clockid_t id, &timespec)

Эти часы предоставляются всем виртуальным машинам через сетевой механизм PTP и регистрируются как динамические часы для целей clock_gettime(3) .

Время UTC представлено параметром CLOCK_REALTIME в clock_gettime(3) .

Дополнительный драйвер устройства

Производители оборудования имеют возможность предоставлять доступ к блоку данных устройства Linux для получения дополнительных временных параметров. Доступ к этим параметрам осуществляется с помощью управления правами доступа через sepolicy:

# in device/OEM/target/sepolicy/time/file_contexts
/dev/sdvtime u:object_r:time_device:s0

Производители оригинального оборудования (OEM) несут ответственность за разработку и функциональность пользовательского драйвера устройства Linux, который предоставляет доступ к API для блока устройства.

Уведомления и обратные звонки

Уведомления и обратные вызовы для компонентов времени в SDV — это возможности пользовательского пространства, предоставляемые OEM-производителем. Платформа SDV не предоставляет специальных API для этих функций.

Для каждой виртуальной машины должна быть запущена не более одной OEM-службы, требующей функции синхронизации времени, которая обрабатывает все соответствующие изменения времени, подлежащие мониторингу. Например, когда изменяется состояние доверия для текущего источника времени:

  • Изменения состояния источника времени ожидаются как события с низкой частотой, поэтому сервис OEM-производителя может проверять изменения посредством опроса, например, раз в минуту.

  • Блоки управления (ECU) передают по сети информацию о состоянии часов UTC, например, по протоколу SOME/IP.

  • Сервис OEM публикует определенные темы Data Tunnel , чтобы сообщать подписчикам об этих изменениях.

  • Производители оборудования настраивают политику авторизации для сервисов, чтобы определить, какие из них могут подписаться на эти темы туннеля данных для отслеживания изменений состояния времени, которым доверяют.

Статус ошибки и ее обработка

Коды ошибок соответствуют соглашениям стандартных API Linux, например:

  • Если clock_gettime() завершается с ошибкой, она возвращает -1 , и устанавливается значение errno ; это означает, что операция синхронизации не поддерживается или базовый источник синхронизации не готов.

  • Если fopen() завершится неудачей, она вернет нулевой указатель, и будет установлен параметр errno ; это означает, что блочное устройство недоступно.

  • Если вызов ioctl() завершается неудачей, возвращается -1 , и устанавливается значение errno ; это означает, что указанный код запроса не имеет соответствующего ответа от базового драйвера.