Hallo, in der C-Datei im Anhang: in der "message" überspringe ich zunächst das erste byte (message+1). Von den folgenden 5 bytes interessiert mich nur das 5. (ffdmTemp->numberOfFields hat also den Wert = 3, somit folgen also 3 Elemente vom Typ "FieldDefContents_t"). Soweit so gut. Wenn ich nun auf ARM debugge (siehe PPT-Anhang) geschieht etwas seltsames.. Das Array beginnt auf Adresse 2001C4, das passt. fddmTemp ist auf 2001C5, passt auch, da ich ja message+1 ausgeführt hatte. Was nicht mehr passt (oder ich übersehe etwas) ist, dass fddmTemp->fdc auf 2001CD steht und somit 4 bytes zu weit hinten. Somit ist fdc[0] 0x07 0x08 0x09 anstatt 0x04 0x05 0x06. Wenn ich das selbe Prog auf meinem PC laufen lasse (icc win32), passt alles... Habe ich hier ein Big/Little endian Problem? sieht eigentlich nicht so aus, aber wer weiss.. Wäre für eine gute Erklärung dankbar.. Gruss Joe Fast vergessen, welchen COMPILER ich nehme...: CF:\>arm-uclibc-gcc -v Reading specs from /cygdrive/c/Cygnus/arm-tools/bin/../lib/gcc-lib/arm-thumb-elf /3.3.1/specs Configured with: /home/Unknown/toolchain/build/gcc-3.3.1/configure --target=arm- thumb-elf --host=i686-pc-cygwin --build=i686-pc-cygwin --prefix=/arm-tools --exe c-prefix=/arm-tools --bindir=/arm-tools/bin --sbindir=/arm-tools/sbin --sysconfd ir=/arm-tools/etc --datadir=/arm-tools/share --localstatedir=/arm-tools/var --ma ndir=/arm-tools/man --infodir=/arm-tools/info --libdir=/arm-tools/lib --included ir=/arm-tools/include --with-local-prefix=/arm-tools/usr/local --with-gxx-includ e-dir=/arm-tools/include/c++ --enable-target-optspace --disable-nls --with-gnu-a s --with-gnu-ld --disable-__cxa_atexit --enable-languages=c,c++ --enable-shared --program-prefix=arm-uclibc- Thread model: single gcc version 3.3.1
Es sind nur 3 Bytes, und die kommen durch das Alignment auf die 4 Byte = Wort Grenze. Will man das nicht haben, kann man das dem GCC mittels
1 | #pragma pack(1) |
oder
1 | __attribute__((packed)) |
mitteilen.
Jo, bei Keil schreibt man meine ich einfach packed vor das struct. Merke: Es ist dem Compiler erlaubt beliebige Füllbytes in ein Struct einzufügen. Damit wird der Zugriff auf die Elemente Optimiert.
Falls man solche Füllbytes aufspüren will, einfach dem Compiler -Wpadded mitgeben. Das erzeugt dann jedes mal eine warning, wenn der Compiler Bytes hinzufügt. Man kann dann z.B. die Reihenfolge der Elemente im Struct ändern, um eine bessere Ausnutzung zu bekommen. Die Gesamtgröße vom Struct wird dann aber ev trotzdem noch gepadded.
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.