Winarm, Alignmentthema

Gast #2110267
Lesenswert?

Hallo werte Forenmitglieder,

ich habe mal wieder ein Problem und beim lesen der Doku relativ viel 
Ohrensausen bekommen...

Das Problem sieht wie folgt aus:

Ich habe ein Array angelegt,
1
static vuint8 cto[kXcpMaxCTO];

, welches von einer Codekomponente über ein Union ausgelesen wird. Der 
Union macht dann 8Bit, 16Bit und 32Bit Zugriffe.
1
typedef union {
2
  /* There might be a loss of up to 3 bytes. */
3
  tEightByteField   EightByteField;
4
  vuint16           b[ ((kXcpMaxCTO + 3) & 0xFFC) / 2  ];
5
  vuint16           w[ ((kXcpMaxCTO + 3) & 0xFFC) / 2  ];
6
  vuint32           dw[ ((kXcpMaxCTO + 3) & 0xFFC) / 4 ];
7
} tXcpCto;

Per default scheint der Compiler/Linker das Array irgendwo hinzulegen - 
kein Alignment. Wenn der 32-Bit-Unionzugriff kommt und das Array nicht 
auf 4 Byte aligned ist, knallts.

Wie verhindere ich das am sinnvollsten? Ich tu mich mit so 
Speicherallokierungs- und zugriffsthemen häufig schwer...
Zu Testzwecken habe ich das Array selbst aligned durch einfügen von 
entsprechenden Variablen vor dem Array...

Makefile und Linkerfile sind eigentlich weitestgehend 
Standardauslieferungszustand von Winarm.

Vielen Dank für Eure Hilfe.
Gruß, Christian
Gast #2110334
Lesenswert?

Hab grad den falschen Union kopiert... hier der Richtige...
1
typedef union {
2
  /* There might be a loss of up to 3 bytes. */
3
  vuint8  b[ ((kXcpMaxCTO + 3) & 0xFFC)      ];
4
  vuint16 w[ ((kXcpMaxCTO + 3) & 0xFFC) / 2  ];
5
  vuint32 dw[ ((kXcpMaxCTO + 3) & 0xFFC) / 4 ];
6
} tXcpCto;
Gast #2110396
Lesenswert?

Besten Dank! Das funktioniert schon mal.

Gibts auch ne Chance das über Compiler- oder Linkerflags zu erledigen? 
Dadurch würde man zwar ein wenig Speicher verschwenden(weil das Feature 
ja nicht in allen Fällen gebraucht wird) aber zumindest kann man nicht 
noch mehr solchen Problemen ahnungslos in die Fänge laufen...
#2110429
Lesenswert?

er muß doch schon das uint8-Feld korrekt ausrichten, wenn ich es richtig 
verstanden habe...

Wenn er von der union eine Variable hätte, wäre die korrekt 
ausgerichtet.
Wahrscheinlich will er die Adresse des Feldes als Zeiger auf die union 
interpretieren oder sowas ähnlich versautes.
Gast #2110458
Lesenswert?

Es sind definitiv Pointerschweinereien aber ich darf den Code nicht 
anpassen. Ist kostenloser Quellcode eines sehr bekannten - fast - 
Monopolisten in der Automobilindustrie ... der ganze Code ist gruselig. 
Bis ich den Code gelesen hatte, wusste ich nicht einmal dass es GOTO 
Anweisung auch in C gibt.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren