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
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.