Escrever uma definição de tipo SOME/IP

Ao definir mapeamentos de middleware escalonável orientado a serviços sobre IP (SOME/IP) em VSIDL, você descreve a serialização do formato de transmissão e a codificação de payload de cada mensagem SOME/IP. Usando as definições SomeIpType e SomeIpStruct, é possível modelar primitivos, strings, matrizes e structs aninhados que correspondem ao AUTOSAR ARXML (SOMEIP-TRANSFORMATION-PROPS) e às regras de codificação de payload da pilha SOME/IP (incluindo COVESA vsomeip).

Esta página se concentra em como escrever uma definição de tipo SomeIpStruct, que é usada em blocos type_definition para mapeamentos de eventos e métodos.

Mensagem SomeIpStruct

Uma mensagem SomeIpStruct representa um payload SOME/IP estruturado que consiste em vários campos. A estrutura definida aqui é usada pelo broker SOME/IP para traduzir entre bytes brutos de SOME/IP e os campos de uma mensagem protobuf SDV.

Ao definir uma struct, você configura duas propriedades principais:

  • length_field_size (opcional): especifica o tamanho (em bytes) do campo de comprimento que precede a struct no payload serializado. Os valores usados da enumeração LengthFieldSize incluem ZERO (sem campo de comprimento), ONE, TWO e FOUR.
  • field (repetido): uma lista de campos que compõem a struct.

Definir campos de struct

Cada campo em SomeIpStruct exige:

  • field_name: o nome do campo. Ele precisa corresponder exatamente ao nome do campo correspondente definido na mensagem protobuf do SDV para garantir a tradução adequada da mensagem.
  • field_type: o tipo de dados SOME/IP do campo (SomeIpType). Pode ser uma primitiva, string, matriz ou outra struct aninhada.

Escrever tipos de campo SomeIpType

O bloco field_type configura o tipo de dados específico usando uma das seguintes variantes:

  • Tipos primitivos:use someip_primitive com valores como UINT8, UINT32, INT32, FLOAT32 e BOOL.
  • Strings:use someip_string e especifique a codificação (por exemplo, UTF_8 ou UTF_16_LE) e as informações de comprimento (fixed_length ou length_field_size).
  • Matrizes:use someip_array e defina array_type (que é outro SomeIpType recursivo), além de informações de comprimento (fixed_length ou length_field_size).
  • Structs aninhadas:use someip_struct para incorporar outra definição de struct de forma recursiva.

Exemplo: escrever uma definição de tipo struct

Confira um exemplo prático de como escrever um SomeIpStruct dentro de um bloco type_definition. Esse payload contém um número inteiro não assinado de 8 bits chamado interval e um número inteiro não assinado de 32 bits chamado 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
    }
  }
}

Adicionar tipos complexos

Para incluir um campo de string de comprimento dinâmico e uma matriz dentro da struct, adicione campos como este:

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

Mapear ARXML do AUTOSAR e codificação de payload vsomeip

Ao integrar o SDV do AAOS com unidades de controle eletrônico (ECUs) AUTOSAR externas ou pilhas SOME/IP, como COVESA vsomeip, verifique se o VSIDL type_definition corresponde aos parâmetros de serialização de fio definidos no ARXML do sistema (SOMEIP-TRANSFORMATION-PROPS e SOMEIP-DATA-PROTOTYPE-TRANSFORMATION-PROPS) ou na configuração vsomeip:

AUTOSAR ARXML e parâmetro vsomeip Equivalente em VSIDL SomeIpType Regra de serialização de transmissão e codificação de payload
sizeOfStructLengthField (0, 1, 2, 4 bytes) SomeIpStruct.length_field_size (ZERO, ONE, TWO, FOUR) Adiciona um prefixo de comprimento de byte explícito antes do payload da struct serializada. Defina como ZERO para estruturas de layout fixo sem um prefixo de comprimento.
sizeOfArrayLengthField (0, 1, 2, 4 bytes) SomeIpArray.length_field_size (ZERO, ONE, TWO, FOUR) ou fixed_length As matrizes dinâmicas exigem um prefixo de campo de comprimento (ONE, TWO ou FOUR bytes) que indica o comprimento em bytes dos elementos da matriz serializada.
sizeOfStringLengthField e codificação (UTF-8, UTF-16LE, UTF-16BE) SomeIpString.string_encoding e length_field_size ou fixed_length Corresponde às regras de serialização de strings AUTOSAR (incluindo marca de ordem de bytes e tratamento de encerramento nulo) para strings de comprimento variável e fixo.
Tipos básicos primitivos (uint8, uint16, uint32, float32, boolean) SomeIpPrimitive (UINT8, UINT16, UINT32, INT32, FLOAT32, BOOL) Codifica valores primitivos na ordem de bytes da rede (big-endian por padrão de acordo com a especificação SOME/IP) correspondente ao campo protobuf de destino.