mikrocontroller.net

Forum: Compiler & IDEs kleines String-Problem


Autor: Karsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: T. Stütz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
irgendwo ein #define char long ??

Autor: Karsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AFAIK ist WinARM für beide Varianten gebaut und little-endian default.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.