כשמגדירים מיפויים של תוכנת ביניים מבוססת-שירות וניתנת להרחבה על גבי IP (SOME/IP) ב-VSIDL, מתארים את הסריאליזציה של פורמט החיבור ואת קידוד המטען הייעודי (payload) של כל הודעת SOME/IP. בעזרת ההגדרות SomeIpType ו-SomeIpStruct, אפשר ליצור מודלים של פרימיטיבים, מחרוזות, מערכים ומבנים מוטבעים שתואמים ל-AUTOSAR ARXML (SOMEIP-TRANSFORMATION-PROPS) ולכללי הקידוד של מטען הייעודי (payload) של SOME/IP stack (כולל COVESA vsomeip).
בדף הזה נסביר איך לכתוב הגדרת סוג SomeIpStruct, שמשמשת בבלוקים type_definition למיפוי אירועים ושיטות.
הודעה מסוג SomeIpStruct
הודעה מסוג SomeIpStruct מייצגת מטען ייעודי (payload) מובנה של SOME/IP שמורכב מכמה שדות. המבנה שמוגדר כאן משמש את מתווך SOME/IP כדי לתרגם בין בייטים גולמיים של SOME/IP לבין השדות של הודעת SDV protobuf.
כשמגדירים struct, קובעים שני מאפיינים עיקריים:
-
length_field_size(אופציונלי): מציין את הגודל (בבייטים) של שדה האורך שקודם למבנה הנתונים במטען הייעודי (payload) שעבר סריאליזציה. הערכים שבהם נעשה שימוש מתוך enumLengthFieldSizeכוללים אתZERO(ללא שדה אורך),ONE,TWOו-FOUR. -
field(repeated): רשימה של שדות שמרכיבים את המבנה.
הגדרת שדות של struct
כל שדה בתוך 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כדי להטמיע הגדרה אחרת של מבנה נתונים באופן רקורסיבי.
דוגמה: כתיבת הגדרה של סוג struct
הנה דוגמה מעשית לאופן הכתיבה של SomeIpStruct בתוך בלוק type_definition. המטען הייעודי (payload) הזה מכיל מספר שלם לא מסומן בן 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 וקידוד מטען ייעודי (payload) של vsomeip
כשמשלבים AAOS SDV עם יחידות בקרה אלקטרוניות (ECU) חיצוניות של AUTOSAR או עם מחסניות SOME/IP כמו COVESA vsomeip, צריך לוודא ש-VSIDL type_definition תואם לפרמטרים של סריאליזציית הנתונים ב-ARXML של המערכת (SOMEIP-TRANSFORMATION-PROPS וSOMEIP-DATA-PROTOTYPE-TRANSFORMATION-PROPS) או להגדרת vsomeip:
פרמטר AUTOSAR ARXML ו-vsomeip |
מקבילה ל-VSIDL SomeIpType |
כלל קידוד של מטען ייעודי (payload) וסדרות (serialization) של נתונים |
|---|---|---|
sizeOfStructLengthField (0, 1,
2, 4 בייט) |
SomeIpStruct.length_field_size (ZERO,
ONE, TWO, FOUR) |
מוסיף קידומת של אורך בבייטים לפני מטען הייעודי (payload) של המבנה שעבר סריאליזציה. מגדירים את הערך ZERO למבני נתונים עם פריסה קבועה ללא קידומת אורך. |
sizeOfArrayLengthField (0, 1,
2, 4 בייט) |
SomeIpArray.length_field_size (ZERO,
ONE, TWO, FOUR) או
fixed_length |
מערכים דינמיים דורשים קידומת של שדה אורך (ONE, TWO או FOUR בייטים) שמציינת את אורך הבייטים של רכיבי המערך שעברו סריאליזציה. |
sizeOfStringLengthField וקידוד (UTF-8,
UTF-16LE, UTF-16BE) |
SomeIpString.string_encoding וגם length_field_size או fixed_length |
התאמה לכללי סריאליזציה של מחרוזות AUTOSAR (כולל סימון סדר בתים וטיפול בסיום null) למחרוזות באורך משתנה ובאורך קבוע. |
סוגי בסיס פרימיטיביים (uint8, uint16,
uint32, float32, boolean) |
SomeIpPrimitive (UINT8,
UINT16, UINT32, INT32,
FLOAT32, BOOL) |
מקודד ערכים פרימיטיביים בסדר בתים ברשת (big-endian כברירת מחדל לפי מפרט SOME/IP) שתואם לשדה היעד של protobuf. |