Hallo Zusammen
Ich Arbeite hier mit einem Freescale i.mx257 basiert auf ARM926EJ-S
mit einem Olimex arm-usb-tiny JTag Wiggler, OpenOCD und CodeSourcery G++
Lite.
Ich kann via JTag das elf File ins Ram laden. Wenn ich nun jedoch durch
das Programm steppe, führt der Controller die Befehle nicht aus. Weder
Move's noch irgend welche Branches, auch werden keine Flags bei Compares
gesetzt. Nur der Programm Counter wird um 4 erhöht.
Ich habe so etwas noch nie gesehen und habe keine Ahnung wieso. Hoffe
mir kann jemand weiterhelfen.
Hallo,
ist der Core im ARM-Mode oder im Thumb-Mode? Wenn er z.B. im Thumb-Mode
ist, wegen eines integrierten Bootloaders etc., dann kann der Code nicht
richtig ausgeführt werden, wenn dieser für ARM-Mode compiliert wurde.
Vielleicht hilf Dir das weiter, hatte auch schon dieses Problem bei
einem ARM11.
Gruß Microman
Huch habe gar nicht gesehen dass mir geantwortet wurde.
Der ARM ist im Thumb-Mode. Bin sogar so weit gegangen das ich den Opcode
von Hand assembliert habe. Kein Erfolg.
Gibt es in der ARM Architektur eine Möglichkeit die ausführung von
fremdem code zu unterbinden? Das Problem ist nämmlich, dass bevor ich
das Board via JTAG resete der uboot-bootloader startet. Ich vermute,
dass dieser irgend ein Schutzmechanismus aktiviert den ich nicht kenne.
Weiss langsam nicht mehr weiter:-(
T. Wüthrich schrieb:> Nur der Programm Counter wird um 4 erhöht.T. Wüthrich schrieb:> Der ARM ist im Thumb-Mode.
Da stimmt doch was nicht, oder? Der PC sollte im Thumb state nur um zwei
erhöht werden.
--
Marcus
Ich wollte jetzt schon schreiben das ich einen Fehler gemacht habe und
ich 2 meinte. Jedoch habe ich das jetzt kurz nachgeprüft und dem ist
tatsächlich so, dass der der State falsch war. Peinlich peinlich.
Bemerkt habe ich dies jedoch nicht weil beim ersten Aufruf von
bx lr der PC ins Nirvana geschickt wird. Entweder wird also lr nicht
richtig gesetzt oder etwas ist noch immer falsch.
Die zweite Frage ist für mich warum der State Manuel gesetzt werden muss
und dies der GCC Compiler nicht übernimmt?
die Config sieht folgendermassen aus:
[code]
-O0 -Wall -Wa,-adhlns="$@.lst" -fno-exceptions -fno-rtti -c
-fmessage-length=0 -mcpu=arm926ej-s -mthumb -mthumb-interwork -g -ggdb
[code]
Hallo, setze mal einen Breakpoint auf die Exeption Handlers, oft werden
die vom Debugger nicht ausgeführt, dann siehst du woran es hängt.
Oder dein Debugger leuft mit Code und Source-Code nicht syncron, das
hatte ich auch mal, kleine Abhielfe beim Debugger ins Dissassembler
Window gehen.
Und schauen was wirklich im RAM steht (vermutlich nichts).
Beim Linker nach dem Adressoffset sehen.
Gruß Sascha
Das setzen der Breakpoints erübrigt sich da ich sowieso step für step
durch den Assembler code steppe.
Es ist unterdessen klar wieso der PC falsch gesezt wird. Hier das
Assembler Listing:
Da das Programm ab 80008000 startet kann, meiner Meinung nach, lr keinen
gültigen Wert beinhalten.
Des weiteren frage ich mich ob der Compiler nicht eine Initialisierung
einfügen müsste, um den State von ARM zu Thumb zu wechseln? Oder muss
dies Anfangs mit __asm() selbst gemacht werden?
T. Wüthrich schrieb:> Des weiteren frage ich mich ob der Compiler nicht eine Initialisierung> einfügen müsste, um den State von ARM zu Thumb zu wechseln? Oder muss> dies Anfangs mit __asm() selbst gemacht werden?
Benenne Deine Funktion _init() nach _init_thumb() um. Erzeuge eine
Funktion _init(), die nichts anderes macht, als _init_thumb()
aufzurufen. Übersetze _init() in ARM code. Lass den Linker den Rest
richten.