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:
1 | 80008000 <_init>: |
2 | 80008000: b5f8 push {r3, r4, r5, r6, r7, lr} |
3 | 80008002: 46c0 nop (mov r8, r8) |
4 | 80008004: bcf8 pop {r3, r4, r5, r6, r7} |
5 | 80008006: bc08 pop {r3} |
6 | 80008008: 469e mov lr, r3 |
7 | 8000800a: 4770 bx lr |
8 | Disassembly of section .text: |
9 | |
10 | 8000800c <__do_global_dtors_aux>: |
11 | 8000800c: b510 push {r4, lr} |
12 | 8000800e: 4c07 ldr r4, [pc, #28] (8000802c <__do_global_dtors_aux+0x20>) |
13 | 80008010: 7823 ldrb r3, [r4, #0] |
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.