Synchronizacja czasu

Platforma Software Defined Vehicle (SDV) w AAOS określa standardowe mechanizmy raportowania źródła czasu z elektronicznych jednostek sterujących (ECU) oraz standardowe interfejsy do udostępniania informacji o czasie w instancjach SDV. Na tej stronie znajdziesz szczegółowe informacje i wskazówki dotyczące standardu SDV.

Architektura zegara

Platforma SDV ma 2 standardowe zegary:

  • Zegar UTC: standardowy zegar uniwersalnego czasu koordynowanego. Zwykle SOME/IP udostępnia te informacje z ECU do środowiska wykonawczego platformy. Przykłady zastosowań to m.in. sprawdzanie ważności certyfikatów, diagnostyka i V2X.

  • Monotoniczny zegar sieciowy: jest to sygnał zegara o wysokiej dokładności, który nie maleje i jest dostarczany z ECU. Szersza architektura pojazdu używa go do koordynowania zdarzeń. Jednostki ECU udostępniają te informacje platformie SDV za pomocą protokołu gPTP. Ten zegar jest też nazywany zegarem stałym.

Zegary na platformie SDV mają określone wymagania architektoniczne:

  • Dostarczanie zegara: każda instancja maszyny wirtualnej ma dostęp do tego samego sygnału zegara monotonicznego dostarczanego przez jednostki ECU.

  • Integralność zegara: wejście zegara monotonicznego sieci powinno być wiarygodnym źródłem do koordynowania zdarzeń w usługach. Ochrona przed potencjalnymi lukami w systemie, takimi jak ataki typu replay lub odwrócenie czasu, opiera się na integralności zegara monotonicznego.

  • Używanie alarmów: interfejsów API zegara platformy SDV nie należy używać w przypadku zdarzeń o wysokiej częstotliwości występowania (> 100 Hz) lub opóźnieniu < 10 ms między zaplanowaniem a czasem zdarzenia. Interfejsy API o wysokiej częstotliwości lub krótkim czasie oczekiwania powinny korzystać ze sterownika jądra.

Interfejsy Clock API

Monotoniczny zegar sieciowy jest udostępniany przez standardowy interfejs 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)

Jest on udostępniany wszystkim maszynom wirtualnym za pomocą mechanizmu sieci PTP i jest rejestrowany jako zegar dynamiczny na potrzeby clock_gettime(3).

Zegar UTC jest oznaczony symbolem CLOCK_REALTIMEclock_gettime(3).

Opcjonalny sterownik urządzenia

Producenci OEM mogą udostępniać blok urządzenia z systemem Linux na potrzeby dodatkowych właściwości czasu. Udostępnij to za pomocą obsługi uprawnień w sepolicy:

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

Producenci OEM odpowiadają za opracowywanie i możliwości niestandardowego sterownika urządzenia z systemem Linux, który udostępnia interfejsy API blokowi urządzenia.

Powiadomienia i wywołania zwrotne

Powiadomienia i wywołania zwrotne dotyczące komponentów czasowych w SDV to funkcje przestrzeni użytkownika udostępniane przez producenta OEM. Platforma SDV nie udostępnia konkretnych interfejsów API dla tych funkcji.

Na każdą maszynę wirtualną wymagającą funkcji synchronizacji czasu powinno przypadać maksymalnie 1 usługa OEM, która obsługuje wszystkie istotne zmiany czasu, które mają być monitorowane. Na przykład gdy zmieni się stan zaufania bieżącego źródła czasu:

  • Zmiany stanów źródła czasu są zdarzeniami o niskiej częstotliwości, więc usługa OEM może sprawdzać zmiany przez odpytywanie, np. raz na minutę.

  • Jednostki ECU przekazują stan zaufania zegara UTC przez sieć, np. za pomocą protokołu SOME/IP.

  • Usługa OEM publikuje określone tematy Data Tunnel, aby przekazywać te zmiany subskrybentom.

  • Producenci OEM dostosowują zasady autoryzacji usług, aby określić, które z nich mogą subskrybować te tematy Data Tunnel i nasłuchiwać zmian zaufanego stanu czasu.

Stan błędu i obsługa

Kody błędów są zgodne z konwencjami standardowych interfejsów API Linuksa, np.:

  • Jeśli funkcja clock_gettime() się nie powiedzie, zwraca wartość -1 i ustawia wartość errno. Oznacza to, że operacja zegara nie jest obsługiwana lub podstawowe źródło zegara nie jest gotowe.

  • Jeśli funkcja fopen() się nie powiedzie, zwraca wskaźnik o wartości null i ustawia wartość errno. Oznacza to, że urządzenie blokowe jest niedostępne.

  • Jeśli wywołanie ioctl() się nie powiedzie, zwraca wartość -1 i ustawia wartość errno. Oznacza to, że określony kod żądania nie ma pasującej odpowiedzi z podstawowego sterownika.