Project

General

Profile

Actions

Support Request #3810

closed

DDL struct alignment in DDL3.0

Added by hidden over 5 years ago. Updated over 5 years ago.

Status:
Closed
Priority:
Normal
Customer:
AUDI
Department:
EF
Requester's Priority:
Normal
Support Level:
2nd Level
Resolution:
Solved Issue
Product Issue Numbers:
Affected Products:
Platform:
Windows 7 64bit
Topic:
ADTF::DDL
FAQ Links:

Description

Support Anfrage:

Ich habe zwei Fragen zum SDK-Artikel "DDL Definition File Format". Das Alignment aus <struct> beeinflußt in DDL 2.x nur das Alignment in Arrays, wie ich lese.

1. Gilt das nur für Arrays mit arraysize > 1? Oder wird auch das erste Element anhand des <struct>-Alignments ausgerichtet?
2. Betrifft das <struct>-Alignment in DDL 3.0 weiterhin nur Arrays? Wirkt sich das <struct>-Alignment von 8 in der folgenden DDL 3.0 auf die Größe aus? Oder nicht (wie beobachtet), da die <struct> nicht von einem Element referenziert wird? Die tatsächliche Größe im DAT-File ist 43 bytes gegenüber den von mir vermuteten 48 bytes.

DDL 3.0:

  <struct alignment="8" name="t_CAN_PCR_01_CAN_PCR_01" version="1">
   <element alignment="8" arraysize="1" byteorder="LE" bytepos="0" name="ESP_v_ref" type="tFloat64" />
   <element alignment="1" arraysize="1" byteorder="LE" bytepos="8" name="ESP_v_ref_Fahrtrichtung" type="tUInt8" />
   <element alignment="1" arraysize="1" byteorder="LE" bytepos="9" name="PCR_Sensorstatus" type="tBool" />
   <element alignment="8" arraysize="1" byteorder="LE" bytepos="16" name="PCR_Obj_vx_rel" type="tFloat64" />
   <element alignment="8" arraysize="1" byteorder="LE" bytepos="24" name="PCR_Obj_vy_rel" type="tFloat64" />
   <element alignment="8" arraysize="1" byteorder="LE" bytepos="32" name="PCR_Obj_TTC" type="tFloat64" />
   <element alignment="1" arraysize="1" byteorder="LE" bytepos="40" name="PCR_Obj_Guete" type="tUInt8" />
   <element alignment="1" arraysize="1" byteorder="LE" bytepos="41" name="PCR_Crashwahrscheinlichkeit" type="tUInt8" />
   <element alignment="1" arraysize="1" byteorder="LE" bytepos="42" name="PCR_Sensorstatus_02" type="tUInt8" />
  </struct>
  <stream description="streamid_5" name="TargetPCC" type="adtf.core.media_type">
    <struct bytepos="0" name="t_CAN_PCR_01_CAN_PCR_01" type="t_CAN_PCR_01_CAN_PCR_01" />
  </stream>

Lösung:

zu Frage 1.:
Die Position wird immer anhand des Alignments ausgerichtet. In der 2.0 hat der Coder nur den Fehler gemacht, dass er bei Arrays das letze Element nicht auf seine richtige Größe gepadded hat (wenn das Alignment das gefordert hätte), heißt die Gesamtgröße eine Arrays (auch wenn's nur 1 Element hatte) war nicht notwendiger weise ein Vielfaches des Alignments, die Positionen der Elemente passten aber zum Alignment.

zu Frage 2.:
Hier bist du wie viele andere über die Unterscheidung zwischen serialisierter und deserialiserter Beschreibung gestolpert. Die DDL beschreibt zwei Fassungen in einem :-):

deserialisiert: Positionen und Größen werden auf Basis des Alignments und Typgröße berechnet (alignment + type attribute, byte order ist immer nativ)
serialisiert: Positionen sind durch das bytepos Attribut festgelegt. (bytepos + type + byteorder attribute)
Der Recorder serialisiert die Daten im Speicher der Media Samples mit Hilfe der deserialisierten Beschreibung in die serialisierte Fassung. Daher landen in deinem Beispiel nur 43 Byte auf der Platte.

Details siehe die Kommentare: #3810-5; #3810-8; #3810-11

Actions

Also available in: Atom PDF