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


von Sven W. (woehlb)


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?

von Sven W. (woehlb)


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

von Sven W. (woehlb)


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 !

von Sven W. (woehlb)


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?

von Sven W. (woehlb)


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.

von Sven W. (woehlb)


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.

von Sven W. (woehlb)


Lesenswert?

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

von nobody (Gast)


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

von Lasse S. (cowz) Benutzerseite


Lesenswert?

Hi,

da meine (Eclipse)Einstellungen genauso aussehen:
1
set mem inaccessible-by-default off
2
monitor speed auto
3
monitor endian little
4
monitor flash device=stm32f103rb
5
monitor flash breakpoints = 1
6
monitor flash download = 1
7
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:
1
monitor reset
2
continue

Vielleicht hilft meine Website da auch weiter:
http://www.punctr.com/joomla/index.php?option=com_content&view=article&id=19:eclipse-projekteinstellungen&catid=5:stm32-einstieg&Itemid=31

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

von Sven W. (woehlb)


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?

von Lasse S. (cowz) Benutzerseite


Lesenswert?

Hi,

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

Gruß
Lasse

von Sven W. (woehlb)


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?

von Lasse S. (cowz) Benutzerseite


Lesenswert?

Hi,

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

Gruß Lasse

von Sven W. (woehlb)


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?

von Sven W. (woehlb)


Lesenswert?

Was bewirkt eigentlich der folgende GDB-Befehl?

set mem inaccessible-by-default off

von Sven W. (woehlb)


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.

von Lutz (Gast)


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).

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.