mikrocontroller.net

Forum: Compiler & IDEs Winarm, Alignmentthema


Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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,
static vuint8 cto[kXcpMaxCTO];

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

Autor: Christian (Gast)
Datum:

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

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schon mal versucht den 32Bit Typen nach oben zu nehmen?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie wird die Union denn kopiert? Pointer-Cast-Schweinereien?

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.