Forum: Compiler & IDEs Winarm, Alignmentthema


von Christian (Gast)


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

von Christian (Gast)


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;

von Klaus W. (mfgkw)


Lesenswert?

Wenn der gcc dahinter steckt, sollte so etwas gehen:
1
   static vuint8 cto[kXcpMaxCTO] __attribute__((aligned(4)));

von Christian (Gast)


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...

von Klaus W. (mfgkw)


Lesenswert?

Ich glaube nicht, daß sich die Verschwendung lohnen würde.
Schließlich wird es ja nur ein paar Stellen geben, wo man
solche Schweinereien macht; die sollte man doch überblicken.

Ich würde dafür mehr Mühe in lesbare Namen investieren :-)

von holger (Gast)


Lesenswert?

Schon mal versucht den 32Bit Typen nach oben zu nehmen?

von Klaus W. (mfgkw)


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.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Wie wird die Union denn kopiert? Pointer-Cast-Schweinereien?

von Christian (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.