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'enumLengthFieldSizeincluentZERO(aucun champ de longueur),ONE,TWOetFOUR.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_primitiveavec des valeurs telles queUINT8,UINT32,INT32,FLOAT32etBOOL. - Chaînes : utilisez
someip_stringet spécifiez l'encodage (par exemple,UTF_8ouUTF_16_LE) et les informations sur la longueur (fixed_lengthoulength_field_size). - Tableaux : utilisez
someip_arrayet définissezarray_type(qui est une autreSomeIpTyperécursive), ainsi que des informations sur la longueur (fixed_lengthoulength_field_size). - Structs imbriqués : utilisez
someip_structpour 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. |