Forum: Mikrocontroller und Digitale Elektronik ARM7 - Startupcode anpassen - Assembler


von Tilo (Gast)


Lesenswert?

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

von Andreas K. (a-k)


Lesenswert?

Tilo Lutz wrote:

> Das Problem ist, dass der uC nach dem Reset losrennt.

Ein anderer gängiger Weg ist eine längere Schleife direkt nach Reset, 
bevor es zum Startup-Code weitergeht. Wenn die lang genug läuft, hat der 
Gebudder ;-) genug Zeit, den Prozessor einzufangen. Und es läuft 
andererseits auch ohne ihn.

von mork (Gast)


Lesenswert?

>ziel 4*8=32=0x20 sein. monitor reg pc 0x00000020 funktioniert aber
>nicht.
>Wo ist mein Denkfehler?

Ich glaub du musst die .word defines auch dazurechnen. Ergibt dann 0x3C.

von Tilo (Gast)


Lesenswert?

Super, das war es!

Danke für die schnelle Hilfe.

Tilo

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

Offset 0x3c passt für das gezeigte Beispiel schon eher. Allerdings kann 
man sich die Rechnerei sparen und den Wert in der Symboldatei ablesen 
(erzeugen mit arm-*-nm). z.B.
...
0008003c t Reset_Handler
...
(hier die tatsächliche Adresse im ADuC7xxx-Flashspeicher nicht die 
"gemappte")

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

ups, mal wieder zu lahm getippt. Aber prima, dass es schon "geklappt" 
hat.

von Tilo (Gast)


Lesenswert?

Stimmt, da steht der Wert. Muss man nur wissen :)

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.