Forum: Mikrocontroller und Digitale Elektronik ARM9EJ-S führt befehle nicht aus


von T. Wüthrich (Gast)


Lesenswert?

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.

von Microman (Gast)


Lesenswert?

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

von T. Wüthrich (Gast)


Lesenswert?

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:-(

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

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

von T. Wüthrich (Gast)


Lesenswert?

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]

von Sascha (Gast)


Lesenswert?

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

von T. Wüthrich (Gast)


Lesenswert?

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?

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.