כתיבת הגדרה של סוג SOME/IP

כשמגדירים מיפויים של תוכנת ביניים מבוססת-שירות וניתנת להרחבה על גבי 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) שעבר סריאליזציה. הערכים שבהם נעשה שימוש מתוך enum‏ LengthFieldSize כוללים את 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.