Forum: Mikrocontroller und Digitale Elektronik STM32 conditional breakpoint


von Peter F. (peter_da_steht_er)


Lesenswert?

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
}

von Jim M. (turboj)


Lesenswert?

Cortex-M kennt AFAIK keine conditional breakpoints in Hardware. In 
Software könnte die dann jedesmal auftretende Wartezeit (USB: also 
einige ms) zu Problemen führen.

von Robert S. (robert_s68)


Lesenswert?

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.

von Random .. (thorstendb) Benutzerseite


Lesenswert?

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.

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.