STM32F103, Keil, Structures und Endian

OP #2282958
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
Angehängte Dateien:
Gast #2285594
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.
Gast #2285630
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.
#2285901
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.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.