www.mikrocontroller.net

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


Autor: Tilo L. (katagia)
Datum:

Bewertung
0 lesenswert
nicht 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:
_vectors:       ldr     PC, Reset_Addr         
                ldr     PC, Undef_Addr
                ldr     PC, SWI_Addr
                ldr     PC, PAbt_Addr
                ldr     PC, DAbt_Addr
                nop              /* Reserved Vector */
                ldr     PC, IRQ_Addr
                ldr     PC, FIQ_Addr

Reset_Addr:     .word   Reset_Handler    /* defined in this module below  */
Undef_Addr:     .word   UNDEF_Routine    /* defined in irq.c  */
SWI_Addr:       .word   SWI_Routine      /* defined in irq.c  */
PAbt_Addr:      .word   PAbt_Routine    /* defined in irq.c  */
DAbt_Addr:      .word   DAbt_Routine    /* defined in irq.c  */
IRQ_Addr:       .word   IRQ_Routine      /* defined in irq.c  */
FIQ_Addr:       .word   FIQ_Routine      /* defined in irq.c  */

# Reset Handler

Reset_Handler:  

.if PLL_SETUP
                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

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: mork (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tilo L. (katagia)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super, das war es!

Danke für die schnelle Hilfe.

Tilo

Autor: Martin Thomas (mthomas) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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")

Autor: Martin Thomas (mthomas) (Moderator) Benutzerseite
Datum:

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

Autor: Tilo L. (katagia)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt, da steht der Wert. Muss man nur wissen :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.