Forum: Mikrocontroller und Digitale Elektronik STM32F103, Keil, Structures und Endian


von Joerg V. (joe535)


Angehängte Dateien:

Lesenswert?

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

von Turbo J (Gast)


Lesenswert?

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.

von Brutus (Gast)


Lesenswert?

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.

von Michael F. (startrekmichi)


Lesenswert?

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