mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Debugging mit Codeblocks und JLink-EDU


Autor: Sven Woehlbier (woehlb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich versuche gerade, ein Programm auf dem STM32F103RB (20k RAM) mit dem 
JLink-EDU zu debuggen. Das Programm wird geflasht und läuft (LED wird 
getoggelt). Der GDB-stoppt am Breakpoint, aber das Programm wird 
komplett abgearbeitet. Außerdem erhalte ich im GDB-Server die folgende 
Fehlermeldung:

ERROR: Could not write CPU register MSP: written: 0x20004FFF

Der Segger GDB-Server hat die Version 4.12.

Meine GDB-Befehle:

monitor speed 10
monitor flash device = STM32F103RB
monitor endian little
monitor flash breakpoints = 1
monitor flash download = 1
load "....../main.elf"
monitor reg r13 = (0x00000000)
monitor reg pc = (0x00000004)

Was könnte das Problem sein?

Autor: Sven Woehlbier (woehlb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meine vermutung ist das der MSP nicht beschrieben werden kann, da PSP 
und MSP nicht zur selben Zeit sichtbar sind. Mit dem Assembler-Befehl 
MRS müßte man den MSP beschreiben können.

Kann ich über den GDB auf dem Mikrocontroller Assembler-Befehle 
ausführen?

z.B.
MRS MSP,PSP

Autor: Sven Woehlbier (woehlb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier mal noch die Log-Daten vom Segger GDB-Server:

Connected to 127.0.0.1
Reading all registers
Read 4 bytes @ address 0x00000000 (Data = 0x20004FFF)
JTAG speed set to 10 kHz
JTAG speed set to 10 kHz
Select flash device: STM32F103RB
Select flash device: STM32F103RB
Target endianess set to "little endian"
Target endianess set to "little endian"
Flash download enabled
Flash download enabled
Flash breakpoints enabled
Flash breakpoints enabled
Writing register (SP = 0x20004FFF)
Writing register (SP = 0x20004FFF)
Writing register (PC = 0x0800025D)
Writing register (PC = 0x0800025D)
Read 2 bytes @ address 0x08000110 (Data = 0xF000)
Read 2 bytes @ address 0x08000110 (Data = 0xF000)
Setting breakpoint @ address 0x08000110, Size = 2, BPHandle = 0x0001
Starting target CPU...
ERROR: Could not write CPU register MSP: Written: 0x20004FFF, Read 
0x20004FFC
All pending breakpoints removed
Connection to debugger closed !

Autor: Sven Woehlbier (woehlb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, der MRS Befehl im vorletzten Post dürfte so nicht funktionieren. Wie 
wäre es mit:

MOV R0,#0x00000000
MSR PSP,R0
MSR MSP,R0

Statt:
monitor reg r13 = (0x00000000)

Nur wie führt man dann Assemblerbefehle über den GDB im uC aus?

Autor: Sven Woehlbier (woehlb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich den Befehl "monitor reset" hinzufüge, bekomme ich die 
Fehlermeldung

ERROR: Could not write CPU register MSP: written: 0x20004FFF

nicht mehr. Aber das Programm wird gestartet, und stoppt nicht bei main.

monitor speed 10
monitor flash device = STM32F103RB
monitor endian little
monitor flash download = 1
monitor flash breakpoints = 1
load "$(TARGET_OUTPUT_FILE)"
monitor reg reg13 = (0x00000000)
monitor reg pc = (0x00000004)
monitor reset

Wenn ich statt "monitor reg r13 ..." den Befehl "monitor reg sp ..." 
benutze ändert das gar nichts. In diesem Fall bekomme ich trotzdem die 
obige Fehlermeldung.

monitor speed 10
monitor flash device = STM32F103RB
monitor endian little
monitor flash download = 1
monitor flash breakpoints = 1
load "$(TARGET_OUTPUT_FILE)"
monitor reg sp = (0x00000000)
monitor reg pc = (0x00000004)

Hat keiner eine Idee? Auf dem Segger-Forum habe ich bis jetzt, auch noch 
keine Antwort erhalten.

Autor: Sven Woehlbier (woehlb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich es mit den folgenden Befehlen versuche, stoppt der Debugger in 
Codeblocks zwar an der Adresse von main. Auf dem uC wird aber das 
Programm komplett ausgeführt, und ein Debuggen ist nicht möglich.

monitor speed 10
monitor flash device = STM32F103RB
monitor endian little
monitor flash download = 1
monitor flash breakpoints = 1
load "$(TARGET_OUTPUT_FILE)"
monitor reg r13 = (0x00000000)
monitor reg pc = (0x00000004)
monitor setbp 0x0800010C
monitor reset

Außerdem erhalte ich eine Fehlermeldung, in der der GDB-Server sich 
beschwert, daß auf einer Adresse zweimal ein Breakpoint gesetzt wird. 
Die absolute Adresse entspricht der Adresse von main.

Autor: Sven Woehlbier (woehlb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei dem GDB handelt es sich um den Debugger des aktuellen "Sourcery G++ 
Lite 2009q3-68 for ARM EABI".

Autor: nobody (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Sven,

ich arbeite zwar nicht mit Codeblock sondern mit Eclipse und CDT aber 
auch ich hab das selbe Problem mit dem Segger j-Link.

Ich kann zwar Breakpoints setzen und die werden auch angezeigt aber der 
Jlink setzt das anscheinend nicht richtig um.

Meine Einstellungen sind:
monitor speed 500
monitor flash device = LM3S817
monitor endian little
monitor flash breakpoints = 1
monitor flash download = 1
load "....../xxx.elf"
monitor reg r13 = (0x00000000)
monitor reg pc = (0x00000004)

Es liegt nicht an J-Link selbst da es mit der Demo von Keil super 
funktioniert, nur halt mit dem GDB nicht.

Step by step scheint aber zu funktionieren.

Wäre auch um jede hilfe dankbar.

Gruß
Jürgen

Autor: Lasse S. (cowz) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

da meine (Eclipse)Einstellungen genauso aussehen:
set mem inaccessible-by-default off
monitor speed auto
monitor endian little
monitor flash device=stm32f103rb
monitor flash breakpoints = 1
monitor flash download = 1
load

Vielleicht fehlt euch das "set mem inaccessible-by-default off"?

Alternativ könnte es vielleicht daran liegen, wie ihr das Programm 
startet, ich tue das über:
monitor reset
continue

Vielleicht hilft meine Website da auch weiter:
http://www.punctr.com/joomla/index.php?option=com_...

Ich fand es praktisch, das erstmal mit dem GDB aus der Konsole 
auszuprobieren, dann ist man sich sicher, dass die IDE nicht noch 
irgendwas zusätzliches macht, was man gar nicht möchte :)

Gruß
Lasse

Autor: Sven Woehlbier (woehlb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Lasse:

Danke, für Deine Anregung. Manchmal muß man eben doch auch mal mit der 
Nase auf ein paar Sachen gestoßen werden. Hier trifft es die Verwendung 
der GDB-Befehls Abschnitte "Initialization Commands" und "Startup 
Commands". Unter Codeblocks gibt es auch 2 solche Abschnitte "Before 
connection" und "After Connection". Allerdings scheinen diese nicht, 
100%ig analog zu den Eclipse Abschnitten zu sein. Jedenfalls bekomme ich 
die obige Fehlermeldung nicht mehr.

Before Connection:
------------------
set mem inaccessible-by-default off
monitor speed auto
monitor endian little
monitor flash device=stm32f103rb
monitor flash breakpoints = 1
monitor flash download = 1
file "$(TARGET_OUTPUT_FILE)"
monitor reg r13 = (0x00000000)
monitor reg pc = (0x00000004)

After Connection:
-----------------
load
thbreak main

Auf diese Weise bin ich jetzt soweit, daß der Debugger auf der Adresse 
von main anhält. Ich kann aber keinen Single Step ausführen. Der erste 
Assembler-Befehl steht auf der Adresse 0x08000152, und der nächste 
Assembler-Befehl steht auf der Adresse 0x08000156. Laut Log des Segger 
GDB-Servers wird aber die Adresse 0x08000154 gelesen, mitten in einem 
Befehlswort!

Segger GDB-Server Log bei einem Single Step:
--------------------------------------------
Performing single step...
...Target halted (PC = 0x08000154)
Reading all registers
Read 4 bytes @ address 0x08000154 (Data = 0xAF00B580)
Performing single step...
...Target halted (PC = 0x08000156)
Reading all registers
Performing single step...
...Target halted (PC = 0x08000158)
Reading all registers
Performing single step...
...Target halted (PC = 0x080002FC)
Reading all registers
Read 4 bytes @ address 0x080002FC (Data = 0xAF00B580)
Read 4 bytes @ address 0x0800015C (Data = 0xBD8046BD)
WARNING: Failed to read memory @ address 0xFFFFFFF0
Read 4 bytes @ address 0xFFFFFFF0 (Data = 0xAAAAAAAA)
Performing single step...
...Target halted (PC = 0x080002FE)
Reading all registers
Read 4 bytes @ address 0x080002FE (Data = 0xF241AF00)
Read 4 bytes @ address 0x0800015C (Data = 0xBD8046BD)

Die Adresse 0x080002FC ist die Startadresse des HardFault-Handlers. Im 
Moment bin ich jedenfalls mal wieder etwas ratlos. Leider antwortet 
niemand im Segger-Forum. Kann ich irgendeine Art Alignment für die 
Befehlsbreite angeben?

Autor: Lasse S. (cowz) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

hast du das mal in der GDB-Konsole ausprobiert? Da siehst du auch schon 
eventuelle Rückmeldungen beim Initialisieren.

Gruß
Lasse

Autor: Sven Woehlbier (woehlb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich das Debuggen auf der GDB-Konsole ausprobieren möchte, muß ich 
doch sicher die Befehle des Abschnittes "Initialization Commands" per 
.gdbinit übergeben, und die Befehle des Abschnittes "Startup Commands" 
per Hand über die Konsole eingeben.

Wo muß sich die Datei .gdbinit befinden? Im aktuellen Verzeichnis oder 
im Intallationspfad des GDB's?

Autor: Lasse S. (cowz) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

du brauchst keine .gdbinit, sondern kannst alle Befehle per Hand 
eingeben.

Gruß Lasse

Autor: Sven Woehlbier (woehlb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also das Debuggen mit dem GDB direkt auf der Befehlszeile funktioniert 
mit den folgenden Befehlen.

target remote localhost:2331
monitor speed auto
monitor endian little
monitor flash device=stm32f103rb
monitor flash breakpoints = 1
monitor flash download = 1
file stm32_md.elf
monitor reg r13 = (0x00000000)
monitor reg pc = (0x00000004)
load
thbreak main
monitor reset
continue

Das Problem ist damit nicht der JLink-EDU sondern Codeblocks. Kennt sich 
jemand mit Codeblocks aus? Wie muß ich Codeblocks einrichten, damit das 
Remote Debugging funktioniert?

Autor: Sven Woehlbier (woehlb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was bewirkt eigentlich der folgende GDB-Befehl?

set mem inaccessible-by-default off

Autor: Sven Woehlbier (woehlb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, ich bin jetzt zu der Kombination Eclipse, Sourcery G++ Lite und dem 
JLink-EDU übergegangen. Es ist schon erstaunlich, wie einfach die 
Konfiguration des Debuggers und des JLinks gegenüber einer Lösung mit 
dem OpenOCD ist. Auch das Debuggen von Interruptroutinen ist so kein 
Problem.

Schade ist nur das es mit Codeblocks nicht geklappt hat, da ich ja mein 
Programm bereits fehlerlos übersetzen konnte. Mir hatte vorgeschwebt mit 
Hilfe meines ersten Projektes einen Projekt-Wizard zu erzeugen, der 
nicht nur das Makefile erzeugt (siehe Eclipse ARM Plugin), sondern auch 
den Debugger und das JTAG-Interface konfiguriert, so daß man sofort eine 
gebrauchsfähige Umgebung hat.

Aber leider habe ich keine Hinweise hier im Forum, im Segger Forum und 
im Codeblocks Forum erhalten, wie man das Remote Debugging mit Hilfe des 
JLinks-EDU konfigurieren muß. Anders als Eclipse scheint Codeblocks ein 
paar Sachen mehr auszuführen als die GDB-Befehle, die man Ihm übergibt. 
Wahrscheinlich ist es deshalb einfach ungeeignet für eine Zusammenarbeit 
mit dem JLink-EDU.

Autor: Lutz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Sven,

vielleicht solltest Du einen Blog auf Deiner Homepage machen und dort 
Deinen Tagesablauf beschreiben statt dieser vielen Monologe, in denen Du 
selbst auf Deine Fragen antwortest. Die Ergebnisse sind, zumindest 
teilweise, sicherlich auch für andere interessant. Aber dann würde es 
als Factsheet ausreichen (Grundsatzproblerm => Lösung).

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.