kleines String-Problem

Gast #364157
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
Gast #364159
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
Moderator Persönliche Seite #364160
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?
Gast #364161
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
Moderator Persönliche Seite #364163
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.
Gast #364164
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
Gast #364165
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

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.