Forum: Mikrocontroller und Digitale Elektronik Strukturen und das Padding Byte


von TheMason (Gast)


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

von Tom (Gast)


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/Variable-Attributes.html#Variable-Attributes

von TheMason (Gast)


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.

von Daniel R. (daniel_r)


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

von TheMason (Gast)


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

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.