mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Strukturen und das Padding Byte


Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich habe ein kleines Problem. Ich habe eine Struktur (8 bit und 16 Bit
Werte gemischt). Diese Struktur ist jedoch word aligned. Sprich wenn
ein 16-Bit Wert an einer ungeraden Adresse liegt wird in der Struktur
ein padding-byte eingefügt. Genau dieses padding-byte will ich aber
vermeiden (weil sonst die Addressen der 16 Bit Werte nicht mehr
stimmen).
Hintergrund ist folgender :

Ich arbeite mit dem MSP430 unter IAR. Ich will mich mit dem Thema FAT
befassen. Der VBR (Volume Boot Record) ist ja 36 byte lang. Definiere
ich aber die Struktur des VBRs, so macht der mir 40 Byte daraus. Es
werden also 4 Padding Bytes eingefügt. Ich kann also nicht einfach die
Struktur definieren, mir nen sektor einlesen und meine Struktur darüber
"mappen" um direkt zugriff auf die einzelnen Datenfelder zu haben.

Meine Frage ist nun : Wie kann ich das Alignment des Compilers in
diesem Fall (und wahrscheinlich noch in weiteren Fällen, wenn ich
beispielsweise Directory Einträge lesen möchte) abschalten ? Ich möchte
das Alignment nciht permanent ausschalten sondern nur für den Zugriff
bei bestimmten strukturen. Gibt es da was ? Irgend eine Pragme
Anweisung vielleicht ?!

Gruß
Rene

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So sollte das gehen (zumindest im GCC):
<code>
          struct foo
          {
            char a;
            int x[2] _attribute_ ((packed));
          };
</code>

Siehe:
http://gcc.gnu.org/onlinedocs/gcc-3.4.6/gcc/Variab...

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi tom,

danke für den tip. aber das scheint wohl nur beim gcc so zu klappen.
(iar zickt dabei rum). wenn ich typedef struct packed { .. } schreibe,
compiliert der das zwar, fügt aber trotzdem noch die padding bytes ein.

Autor: Daniel R. (daniel_r)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich weiß nicht wie das in C genau geht, deshalb erklär ichs einfach so:

Schreib doch einfach genau vor den Datenstrukturen ein 0x00 ins
Programm und fertig. Dann sind alle nachfolgenden 16-Bit Adressen
wieder gerade.
(oder hab ich da was falsch verstanden?)


Daniel

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Daniel

es geht sich darum das ich die roh-daten schon habe (also ohne
padding-byte) und meine struktur aber automatisch ein padding byte hat
(vom compiler aus).
außerdem wäre es zu aufwendig jedesmal zu gucken wo ich die daten
hinpacken muß.
das problem hat sich aber erledigt. es gibt beim iar eine pragma
anweisung mit der ich das alignment für die struktur festlegen kann.

für alle die es evtl. brauchen : #pragma pack(1) schaltet das alignment
auf byte (möglich wären dann auch sachen wie #pragma pack(4) (für
long-alignment))

trotzdem dank an alle
gruß
rene

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.