Forum: Compiler & IDEs kleines String-Problem


von Karsten (Gast)


Lesenswert?

Hallo,

ich habe folgendes deklariert:

char str[]={'T','e','s','t','1','2','3','4'};

Was ich zur Zeit nicht verstehe ist, das ich das deklarierte Array
im Speicher folgendermaßen wiederfinde:

't','s','e','T','4','3','2','1'

In dieser Reihenfolgen werden auch die Zeiche ausgegeben wenn ich
folgendes aufrufe (ist hier nur ein Bsp.):

char* p = str;

for (i = 0; i < 8; i++)
{
   my_putc(*p);
   p++;
}

Ich kann nicht verstehen, warum bei einer Deklaration eines
char-Array's hier wahrscheinlich das Endian-Format eine Rolle spielt.

Weiß jemand Rat?
Karsten

von T. Stütz (Gast)


Lesenswert?

irgendwo ein #define char long ??

von Karsten (Gast)


Lesenswert?

Danke für deine Antwort.

Das ist nicht der Fall. Ich habe wahrscheinlich das Problem gefunden.

Wie ich jetzt feststelle, habe ich euch leider zu wenig Info's
gegeben. Tschuldigung!

Der Prozessor für den ich entwickle, ist der TMS470 von TI. Dieser
Prozessor benötigt das Big-Endian-Format und die WinARM-Toolchain ist
laut Info aus einem anderen Forum für das Little-Endian-Format
ausgelegt.

Die Kompilierung des Codes im Little-Endian Format erzeugt genau dieses
Swapping.

Der nächste Schritt ist festzustellen, ob WinARM wirklich nur das
Little-Endian-Format unterstützt. Oder ob z.B. das Hinzufügen der
Option -mbig-endian zu dem gcc-Aufruf genügt.

Andernfalls ist eine eigene Tool-Chain aufzusetzen.
"Ich freue mich schon drauf!" :-(

Karsten

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Guck doch mal, was dein Compiler für machine-specific options
kennt.  Laut GCC-Manual wären das folgende:

ARM Options -mapcs-frame -mno-apcs-frame -mabi=name -mapcs-stack-check
-mno-apcs-stack-check -mapcs-float -mno-apcs-float -mapcs-reentrant
-mno-apcs-reentrant -msched-prolog -mno-sched-prolog -mlittle-endian
-mbig-endian -mwords-little-endian -mfloat-abi=name -msoft-float
-mhard-float -mfpe -mthumb-interwork -mno-thumb-interwork -mcpu=name
-march=name -mfpu=name -mstructure-size-boundary=n -mabort-on-noreturn
-mlong-calls -mno-long-calls -msingle-pic-base -mno-single-pic-base
-mpic-register=reg -mnop-fun-dllimport -mcir- rus-fix-invalid-insns
-mno-cirrus-fix-invalid-insns -mpoke-function-name -mthumb -marm
-mtpcs-frame -mtpcs-leaf-frame -mcaller-super-interworking
-mcallee-super-interworking

Ich sehe da sowohl Optionen zur Endianess als auch zum CPU-Typ.

Der AVR-GCC gibt zum Beispiel für eine unbekannte -mmcu= Option die
Liste aller bekannten MCU types aus.  Vielleicht ist das ja bei dir
für eine unbekannte -mcpu= Option auch der Fall?

von Karsten (Gast)


Lesenswert?

Hallo Jörg,

I hab mal testweise -mcpu=TMS470 eingesetzt.
Die Kompilierung wurde daraufhin mit einer Fehlermeldung abgebrochen:

FlashLoader.c:0: error: bad value (TMS470) for -mcpu= switch
make: *** [FlashLoader.d] Error 1

Das ich die Option -mbig-endian beim Compiler-Aufruf setzen kann, ist
mir bekannt. Die Frage ist jedoch, ob dies für die Umstellung auf das
Big-Endian-Format ausreicht?

Sieh mal hier:

http://groups.yahoo.com/group/gnuarm/message/1988?threaded=1

Daraufhin fällt mir doch jetzt auf, das ich hier noch nicht erwähnte
mit WinARM zu arbeiten. Hole es hiermit nach.

Karsten

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

AFAIK ist WinARM für beide Varianten gebaut und little-endian default.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Folgendes steht in arm.h:

arm.h: %{mcpu=arm2:-D__ARM_ARCH_2__} \
arm.h: %{mcpu=arm250:-D__ARM_ARCH_2__} \
arm.h: %{mcpu=arm3:-D__ARM_ARCH_2__} \
arm.h: %{mcpu=arm6:-D__ARM_ARCH_3__} \
arm.h: %{mcpu=arm600:-D__ARM_ARCH_3__} \
arm.h: %{mcpu=arm610:-D__ARM_ARCH_3__} \
arm.h: %{mcpu=arm7:-D__ARM_ARCH_3__} \
arm.h: %{mcpu=arm700:-D__ARM_ARCH_3__} \
arm.h: %{mcpu=arm710:-D__ARM_ARCH_3__} \
arm.h: %{mcpu=arm720:-D__ARM_ARCH_3__} \
arm.h: %{mcpu=arm7100:-D__ARM_ARCH_3__} \
arm.h: %{mcpu=arm7500:-D__ARM_ARCH_3__} \
arm.h: %{mcpu=arm7500fe:-D__ARM_ARCH_3__} \
arm.h: %{mcpu=arm7m:-D__ARM_ARCH_3M__} \
arm.h: %{mcpu=arm7dm:-D__ARM_ARCH_3M__} \
arm.h: %{mcpu=arm7dmi:-D__ARM_ARCH_3M__} \
arm.h: %{mcpu=arm7tdmi:-D__ARM_ARCH_4T__} \
arm.h: %{mcpu=arm8:-D__ARM_ARCH_4__} \
arm.h: %{mcpu=arm810:-D__ARM_ARCH_4__} \
arm.h: %{mcpu=arm9:-D__ARM_ARCH_4T__} \
arm.h: %{mcpu=arm920:-D__ARM_ARCH_4__} \
arm.h: %{mcpu=arm920t:-D__ARM_ARCH_4T__} \
arm.h: %{mcpu=arm9tdmi:-D__ARM_ARCH_4T__} \
arm.h: %{mcpu=strongarm:-D__ARM_ARCH_4__} \
arm.h: %{mcpu=strongarm110:-D__ARM_ARCH_4__} \
arm.h: %{mcpu=strongarm1100:-D__ARM_ARCH_4__} \
arm.h: %{mcpu=xscale:-D__ARM_ARCH_5TE__} \
arm.h: %{mcpu=xscale:-D__XSCALE__} \
arm.h: %{mcpu=ep9312:-D__ARM_ARCH_4T__} \
arm.h: %{mcpu=ep9312:-D__MAVERICK__} \
arm.h: %{mcpu=iwmmxt:-D__ARM_ARCH_5TE__} \
arm.h: %{mcpu=iwmmxt:-D__XSCALE__} \
arm.h: %{mcpu=iwmmxt:-D__IWMMXT__} \

Ich kenne mich mit ARM nicht lang, musst mal gucken, was dir
davon am nächsten kommt.

von Karsten (Gast)


Lesenswert?

Hallo Jörg,

bisher nutze ich -mcpu=arm7tdmi. Dies ist soweit auch korrekt, da der
TMS470 einen ARM7TDMI-Core besitzt.
Ich denke mal, dass dies hier nicht das Problem ist.
Aber.., ich mich ja auch irren.
Vielleicht sehe ich den Zusammenhang ja nicht.

Karsten

von Karsten (Gast)


Lesenswert?

Hallo Jörg,

Das Problem scheint gelöst.
Nach dem Verwenden der -mbig-endian Option des gcc und der Umstellung
des upload-Programmes (ebenfalls auf des big endian format) scheint das
Problem aus der Welt zu sein.

Karsten

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.