Hallo
Ich debugge einen ADUC7000 mit Eclipse und Openocd.
So lange ich nur im Ram gebudde, ist alles Ok.
Programme im Flash machen hingegen Probleme. Ich muss zu erst das
Programm z.B. mit dem Loader von ADI ins Flash schreiben. Openocd
kann zwar auch schreiben, aber nur kleine Datenmengen. Bei größeren
Programmen bricht OpenOCD ab.
Nach dem das Programm ins Flash kopiert wurde, muss der uC erst resetten
werden, bevor ich ihn mit openocd ansprechen kann.
Das Problem ist, dass der uC nach dem Reset losrennt. So bald ich mit
IRQs arbeite, macht das debuggen dann keinen Spaß, da diese dann beim
debuggen im "Hintergrund" aktiv sind. Aus diesem Grund hat CrowssWorks
den Startupcode so angepasst, dass der Programmcode bei einem Reset
nicht automatisch ausgeführt wird.
Ich habe mir eine Lösung überlegt. Einen HALT-Befehl scheint es in
Assembler
für ARM7 nicht zu geben, jedenfalls geht weder "hlt" noch "halt".
Der Startupcode beginnt so:
1 | _vectors: ldr PC, Reset_Addr
|
2 | ldr PC, Undef_Addr
|
3 | ldr PC, SWI_Addr
|
4 | ldr PC, PAbt_Addr
|
5 | ldr PC, DAbt_Addr
|
6 | nop /* Reserved Vector */
|
7 | ldr PC, IRQ_Addr
|
8 | ldr PC, FIQ_Addr
|
9 |
|
10 | Reset_Addr: .word Reset_Handler /* defined in this module below */
|
11 | Undef_Addr: .word UNDEF_Routine /* defined in irq.c */
|
12 | SWI_Addr: .word SWI_Routine /* defined in irq.c */
|
13 | PAbt_Addr: .word PAbt_Routine /* defined in irq.c */
|
14 | DAbt_Addr: .word DAbt_Routine /* defined in irq.c */
|
15 | IRQ_Addr: .word IRQ_Routine /* defined in irq.c */
|
16 | FIQ_Addr: .word FIQ_Routine /* defined in irq.c */
|
17 |
|
18 | # Reset Handler
|
19 |
|
20 | Reset_Handler:
|
21 |
|
22 | .if PLL_SETUP
|
23 | LDR R0, =MMR_BASE_0
|
Ich habe mir überlegt, den Code an der Startadresse so zu ändern, dass
der uC dort stehen bleibt, z.B.:
_vectors: b _vectors
Openocd springt normlerweise mit dem Befehl:
monitor reg pc 0x00000000
zur Startposition und beginnt dann mit debuggen.
In diesem Fall will ich aber nicht zu 0x0 sondern dorthin springen, wo
tatsächlich der Resethandler liegt. Ich dachte, ich könnte das neue
Sprungziel einfach abzählen. ein Befehl ist 32bit, also 4Byte breit.
Da der Resethandler mit der 8. Codezeile beginnt, müsste das neue
Sprung-
ziel 4*8=32=0x20 sein. monitor reg pc 0x00000020 funktioniert aber
nicht.
Wo ist mein Denkfehler?
Vielen Dank, Tilo