Écrire une définition de type SOME/IP

Lorsque vous définissez des mappages SOME/IP (Scalable service-Oriented Middleware over IP) dans VSIDL, vous décrivez la sérialisation du format filaire et l'encodage de la charge utile de chaque message SOME/IP. À l'aide des définitions SomeIpType et SomeIpStruct, vous pouvez modéliser des primitives, des chaînes, des tableaux et des structs imbriqués qui correspondent aux règles d'encodage de charge utile de la pile AUTOSAR ARXML (SOMEIP-TRANSFORMATION-PROPS) et SOME/IP (y compris COVESA vsomeip).

Cette page explique comment écrire une définition de type SomeIpStruct, qui est utilisée dans les blocs type_definition pour les mappages d'événements et de méthodes.

Message SomeIpStruct

Un message SomeIpStruct représente une charge utile SOME/IP structurée composée de plusieurs champs. La structure définie ici est utilisée par le courtier SOME/IP pour traduire les octets SOME/IP bruts et les champs d'un message protobuf SDV.

Lorsque vous définissez une structure, vous configurez deux propriétés principales :

  • length_field_size (facultatif) : spécifie la taille (en octets) du champ de longueur qui précède la structure dans la charge utile sérialisée. Les valeurs utilisées de l'enum LengthFieldSize incluent ZERO (aucun champ de longueur), ONE, TWO et FOUR.
  • field (répété) : liste des champs qui composent la structure.

Définir les champs struct

Chaque champ de SomeIpStruct requiert :

  • field_name : nom du champ. Il doit correspondre exactement au nom du champ correspondant défini dans le message protobuf SDV pour garantir la bonne traduction du message.
  • field_type : type de données SOME/IP du champ (SomeIpType). Il peut s'agir d'une primitive, d'une chaîne, d'un tableau ou d'une autre structure imbriquée.

Écrire des types de champs SomeIpType

Le bloc field_type configure le type de données spécifique à l'aide de l'une des variantes suivantes :

  • Types primitifs : utilisez someip_primitive avec des valeurs telles que UINT8, UINT32, INT32, FLOAT32 et BOOL.
  • Chaînes : utilisez someip_string et spécifiez l'encodage (par exemple, UTF_8 ou UTF_16_LE) et les informations sur la longueur (fixed_length ou length_field_size).
  • Tableaux : utilisez someip_array et définissez array_type (qui est une autre SomeIpType récursive), ainsi que des informations sur la longueur (fixed_length ou length_field_size).
  • Structs imbriqués : utilisez someip_struct pour intégrer une autre définition de struct de manière récursive.

Exemple : Écrire une définition de type struct

Voici un exemple concret de la façon d'écrire un SomeIpStruct dans un bloc type_definition. Cette charge utile contient un entier non signé de 8 bits nommé interval et un entier non signé de 32 bits nommé 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
    }
  }
}

Ajouter des types complexes

Pour inclure un champ de chaîne de longueur dynamique et un tableau dans la structure, ajoutez des champs comme celui-ci :

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

Mapper l'encodage de la charge utile AUTOSAR ARXML et vsomeip

Lorsque vous intégrez AAOS SDV à des unités de contrôle électronique (ECU) AUTOSAR externes ou à des piles SOME/IP telles que COVESA vsomeip, assurez-vous que votre type_definition VSIDL correspond aux paramètres de sérialisation filaire définis dans la configuration ARXML (SOMEIP-TRANSFORMATION-PROPS et SOMEIP-DATA-PROTOTYPE-TRANSFORMATION-PROPS) ou vsomeip de votre système :

Paramètre AUTOSAR ARXML et vsomeip Équivalent VSIDL SomeIpType Règle de sérialisation et d'encodage de charge utile
sizeOfStructLengthField (0, 1, 2, 4 octets) SomeIpStruct.length_field_size (ZERO, ONE, TWO, FOUR) Ajoute un préfixe de longueur d'octet explicite avant la charge utile de la structure sérialisée. Définissez la valeur sur ZERO pour les structs à mise en page fixe sans préfixe de longueur.
sizeOfArrayLengthField (0, 1, 2, 4 octets) SomeIpArray.length_field_size (ZERO, ONE, TWO, FOUR) ou fixed_length Les tableaux dynamiques nécessitent un préfixe de champ de longueur (ONE, TWO ou FOUR octets) indiquant la longueur en octets des éléments du tableau sérialisé.
sizeOfStringLengthField et encodage (UTF-8, UTF-16LE, UTF-16BE) SomeIpString.string_encoding et length_field_size ou fixed_length Respecte les règles de sérialisation des chaînes AUTOSAR (y compris la gestion de la marque d'ordre des octets et de la terminaison nulle) pour les chaînes de longueur variable et fixe.
Types de base primitifs (uint8, uint16, uint32, float32, boolean) SomeIpPrimitive (UINT8, UINT16, UINT32, INT32, FLOAT32, BOOL) Encode les valeurs primitives dans l'ordre des octets sur le réseau (big-endian par défaut selon la spécification SOME/IP) correspondant au champ protobuf cible.