Escribe una definición de tipo de SOME/IP

Cuando defines asignaciones de middleware escalable orientado a servicios sobre IP (SOME/IP) en VSIDL, describes la serialización del formato de cable y la codificación de la carga útil de cada mensaje de SOME/IP. Con las definiciones de SomeIpType y SomeIpStruct, puedes modelar primitivos, cadenas, arrays y structs anidados que coincidan con las reglas de codificación de carga útil de la pila AUTOSAR ARXML (SOMEIP-TRANSFORMATION-PROPS) y SOME/IP (incluido COVESA vsomeip).

En esta página, se explica cómo escribir una definición de tipo SomeIpStruct, que se usa en los bloques type_definition para las asignaciones de eventos y métodos.

Mensaje SomeIpStruct

Un mensaje SomeIpStruct representa una carga útil estructurada de SOME/IP que consta de varios campos. El agente de SOME/IP usa la estructura definida aquí para traducir entre bytes sin procesar de SOME/IP y los campos de un mensaje de protobuf de SDV.

Cuando defines un struct, configuras dos propiedades principales:

  • length_field_size (opcional): Especifica el tamaño (en bytes) del campo de longitud que precede a la struct en la carga útil serializada. Los valores usados del enum LengthFieldSize incluyen ZERO (sin campo de longitud), ONE, TWO y FOUR.
  • field (repetido): Es una lista de campos que componen el struct.

Cómo definir campos de struct

Cada campo dentro de SomeIpStruct requiere lo siguiente:

  • field_name: Es el nombre del campo. Debe coincidir exactamente con el nombre del campo correspondiente definido en el mensaje .proto de SDV para garantizar la traducción correcta del mensaje.
  • field_type: Es el tipo de datos de SOME/IP del campo (SomeIpType). Puede ser un tipo primitivo, una cadena, un array o alguna otra struct anidada.

Escribe tipos de campos de SomeIpType

El bloque field_type configura el tipo de datos específico con una de las siguientes variantes:

  • Tipos primitivos: Usa someip_primitive con valores como UINT8, UINT32, INT32, FLOAT32 y BOOL.
  • Cadenas: Usa someip_string y especifica la codificación (por ejemplo, UTF_8 o UTF_16_LE) y la información de longitud (fixed_length o length_field_size).
  • Arrays: Usa someip_array y define array_type (que es otro SomeIpType recursivo), junto con información de longitud (fixed_length o length_field_size).
  • Structs anidados: Usa someip_struct para incorporar otra definición de struct de forma recursiva.

Ejemplo: Escribe una definición de tipo struct

A continuación, se muestra un ejemplo práctico de cómo escribir un SomeIpStruct dentro de un bloque type_definition. Esta carga útil contiene un número entero de 8 bits sin firma llamado interval y un número entero de 32 bits sin firma llamado 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
    }
  }
}

Cómo agregar tipos complejos

Para incluir un campo de cadena de longitud dinámica y un array dentro de la estructura, agrega campos como los siguientes:

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 }
    }
  }
}

Asigna la codificación de la carga útil de AUTOSAR ARXML y vsomeip

Cuando integres AAOS SDV con unidades de control electrónico (ECU) externas de AUTOSAR o pilas de SOME/IP, como COVESA vsomeip, asegúrate de que tu VSIDL type_definition coincida con los parámetros de serialización de cable definidos en la configuración de ARXML (SOMEIP-TRANSFORMATION-PROPS y SOMEIP-DATA-PROTOTYPE-TRANSFORMATION-PROPS) o vsomeip de tu sistema:

AUTOSAR ARXML y parámetro vsomeip Equivalente de VSIDL SomeIpType Regla de codificación de la carga útil y serialización de cable
sizeOfStructLengthField (0, 1, 2, 4 bytes) SomeIpStruct.length_field_size (ZERO, ONE, TWO, FOUR) Antepone un prefijo explícito de longitud en bytes antes de la carga útil de la struct serializada. Se establece en ZERO para structs de diseño fijo sin un prefijo de longitud.
sizeOfArrayLengthField (0, 1, 2, 4 bytes) SomeIpArray.length_field_size (ZERO, ONE, TWO, FOUR) o fixed_length Los arrays dinámicos requieren un prefijo de campo de longitud (ONE, TWO o FOUR bytes) que indique la longitud en bytes de los elementos del array serializado.
sizeOfStringLengthField y codificación (UTF-8, UTF-16LE, UTF-16BE) SomeIpString.string_encoding y length_field_size o fixed_length Coincide con las reglas de serialización de cadenas de AUTOSAR (incluido el control de la marca de orden de bytes y la terminación nula) para cadenas de longitud variable y fija.
Tipos básicos primitivos (uint8, uint16, uint32, float32, boolean) SomeIpPrimitive (UINT8, UINT16, UINT32, INT32, FLOAT32, BOOL) Codifica valores primitivos en orden de bytes de red (big-endian de forma predeterminada según la especificación de SOME/IP) que coinciden con el campo .proto de destino.