STM32 conditional breakpoint

OP #4517449
Hallo,
ich versuche gerade meine Firmware zu debuggen, bei einer kritischen 
Stelle soll der STM32f103 anhalten, wenn die Variable einen bestimmten 
Wert erreicht.

Ich verwende den Jlink EDU und erhalte beim starten der Debug Session in 
Keil folgende Fehler Meldung:
"this target device does not support conditional breakpoints"

Wo liegt das Problem? Beim STM32 oder beim EDU?

Ich habe es vorübergehend so gelöst.
1
if (on_off == 1)
2
{
3
__asm {bkpt 0};
4
}
#4517479
Jim M. schrieb:
> Cortex-M kennt AFAIK keine conditional breakpoints in Hardware.

Die Cortex-M3 und M4 von STM haben 4 Watchpoints (evt. teilweise auch 
mehr, nicht sicher), die sollten eigentlich genau das unterstützen 
(Break wenn einer Speicherstelle ein bestimmter Wert zugewiesen wird). 
Evt. muss man selbige Variable "volatile" deklariere, sonst weiss der 
Compiler ja nicht, dass er die Werte da drin auch immer gleich ablegen 
soll/muss.

Obs am Keil oder dem Debugger liegt kann ich nicht sagen, verwende 
openocd und st-link.

Die asm bkpt Methode ist insofern praktisch als sie 
breakpoints/watchpoints spart.
Persönliche Seite #4517497
Breakpoints auf Variablen setzt man im MDK per Command Window (Debug 
Session):
1
BS READ myVar;
2
BS WRITE myVar;
3
BS READWRITE myVar;
Dafür wird auf dem Cortex-M eine von 4 Watchpoint Units verwendet 
(Variablen im Logic Analyzer z.B. brauchen auch je eine).
Beim entsprechenden Zugriff auf "myVar" hält das Programm an.

Die Watchpoint Unit kann auch auf Vergleiche mit festen Werten einen 
Breakpoint setzen:
1
BS READ myVar == 0;
2
BS WRITE myVar == 42;
3
BS READWRITE myVar == 1;
Dafür werden 2 Watchpoint Units benötigt (Adress- und Daten-compare).

Mit dem JLink sollte das eig. auch funktionieren.

Für den ULINK / ULINK pro gibt es noch einen STOP/RUN Betrieb, welcher 
grösser / kleiner Vergleiche erlaubt. Dafür wird ein 
READ/WRITE/READWRITE Breakpoint gesetzt, und bei erreichen des BPs der 
Wert der Variablen ausgelesen und mit der Condition / dem Value 
verglichen. Wenn erfüllt -> STOP, wenn nicht erfüllt: RUN.

Wie bei allen Variablen, welche die Watchpoint Unit betreffen, müssen 
auch diese global sein (ggf. local static), also eine feste 
Speicheradresse haben.


VG,
/th.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.