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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.