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?
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
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 !
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?
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.
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.
Bei dem GDB handelt es sich um den Debugger des aktuellen "Sourcery G++ Lite 2009q3-68 for ARM EABI".
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
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
@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?
Hi, hast du das mal in der GDB-Konsole ausprobiert? Da siehst du auch schon eventuelle Rückmeldungen beim Initialisieren. Gruß Lasse
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?
Hi, du brauchst keine .gdbinit, sondern kannst alle Befehle per Hand eingeben. Gruß Lasse
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?
Was bewirkt eigentlich der folgende GDB-Befehl? set mem inaccessible-by-default off
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.