При определении масштабируемых сопоставлений сервисно-ориентированного промежуточного программного обеспечения по IP (SOME/IP) в VSIDL вы описываете формат сериализации и кодирование полезной нагрузки каждого сообщения SOME/IP. Используя определения SomeIpType и SomeIpStruct , вы можете моделировать примитивы, строки, массивы и вложенные структуры, которые соответствуют правилам кодирования полезной нагрузки AUTOSAR ARXML ( SOMEIP-TRANSFORMATION-PROPS ) и стека SOME/IP (включая COVESA vsomeip ).
На этой странице рассматривается, как написать определение типа SomeIpStruct , которое используется в блоках type_definition для сопоставления событий и методов.
Сообщение SomeIpStruct
Сообщение SomeIpStruct представляет собой структурированную полезную нагрузку SOME/IP, состоящую из нескольких полей. Определенная здесь структура используется брокером SOME/IP для преобразования между необработанными байтами SOME/IP и полями сообщения SDV protobuf.
При определении структуры вы задаёте два основных свойства:
-
length_field_size(необязательно): Задает размер (в байтах) поля длины, предшествующего структуре в сериализованной полезной нагрузке. Используемые значения из перечисленияLengthFieldSizeвключаютZERO(нет поля длины),ONE,TWOиFOUR. -
field(повторяется): Список полей, составляющих структуру.
Определите поля структуры.
Для каждого поля внутри SomeIpStruct требуется:
-
field_name: Имя поля. Оно должно точно совпадать с именем соответствующего поля, определенным в сообщении protobuf SDV, чтобы обеспечить корректный перевод сообщения. -
field_type: Тип данных поля (SomeIpType) в формате SOME/IP. Это может быть примитивный тип, строка, массив или другая вложенная структура.
Напишите типы полей SomeIpType
Блок field_type задает конкретный тип данных, используя один из следующих вариантов:
- Примитивные типы: используйте
someip_primitiveсо значениями типаUINT8,UINT32,INT32,FLOAT32иBOOL. - Строки: Используйте
someip_stringи укажите кодировку (например,UTF_8илиUTF_16_LE) и информацию о длине (либоfixed_length, либоlength_field_size). - Массивы: Используйте
someip_arrayи определитеarray_type(который является еще одним рекурсивнымSomeIpType), а также информацию о длине (fixed_lengthилиlength_field_size). - Вложенные структуры: используйте
someip_structдля рекурсивного встраивания определения другой структуры.
Пример: Напишите определение типа структуры.
Вот практический пример того, как написать объект SomeIpStruct внутри блока type_definition . Эта полезная нагрузка содержит 8-битное беззнаковое целое число с именем interval и 32-битное беззнаковое целое число с именем counter :
type_definition {
# No length field precedes this struct
length_field_size: ZERO
# First field: interval
field {
field_name: "interval"
field_type {
someip_primitive: UINT8
}
}
# Second field: counter
field {
field_name: "counter"
field_type {
someip_primitive: UINT32
}
}
}
Добавить сложные типы
Чтобы включить в структуру строковое поле динамической длины и массив, добавьте поля следующим образом:
field {
field_name: "status_message"
field_type {
someip_string {
string_encoding: UTF_8
length_field_size: FOUR
}
}
}
field {
field_name: "measurements"
field_type {
someip_array {
length_field_size: FOUR
array_type { someip_primitive: FLOAT32 }
}
}
}
Сопоставление кодировки полезной нагрузки AUTOSAR ARXML и vsomeip
При интеграции AAOS SDV с внешними электронными блоками управления AUTOSAR (ЭБУ) или стеками SOME/IP, такими как COVESA vsomeip , убедитесь, что type_definition VSIDL соответствует параметрам сериализации проводов, определенным в ARXML вашей системы ( SOMEIP-TRANSFORMATION-PROPS и SOMEIP-DATA-PROTOTYPE-TRANSFORMATION-PROPS ) или конфигурации vsomeip :
Параметры AUTOSAR ARXML и vsomeip | Эквивалент VSIDL SomeIpType | Правила сериализации и кодирования полезной нагрузки. |
|---|---|---|
sizeOfStructLengthField ( 0 , 1 , 2 , 4 bytes) | SomeIpStruct.length_field_size ( ZERO , ONE , TWO , FOUR ) | Добавляет явный префикс длины в байтах перед сериализованной полезной нагрузкой структуры. Установите значение ZERO для структур с фиксированной структурой без префикса длины. |
sizeOfArrayLengthField ( 0 , 1 , 2 , 4 bytes) | SomeIpArray.length_field_size ( ZERO , ONE , TWO , FOUR ) or fixed_length | Для динамических массивов требуется префикс поля длины ( ONE , TWO или FOUR байта), указывающий длину сериализованных элементов массива в байтах. |
sizeOfStringLengthField и кодировка ( UTF-8 , UTF-16LE , UTF-16BE ) | SomeIpString.string_encoding and length_field_size or fixed_length | Соответствует правилам сериализации строк AUTOSAR (включая метку порядка байтов и обработку нулевого завершения) для строк переменной и фиксированной длины. |
Примитивные базовые типы ( uint8 , uint16 , uint32 , float32 , boolean ) | SomeIpPrimitive ( UINT8 , UINT16 , UINT32 , INT32 , FLOAT32 , BOOL ) | Кодирует примитивные значения в сетевом порядке байтов (по умолчанию big-endian согласно спецификации SOME/IP), соответствующем целевому полю protobuf. |