czwartek, 6 sierpnia 2026

STM32 - Debugowanie - __BKPT

Tym razem dosyć krótki post opisujący dodawanie breakpointów bezpośrednio w kodzie programu, bez konieczności korzystania z puli dostępnej np. przez debugger STM32CubeIDE. 


Podstawową instrukcją z jakiej będziemy korzystać to:

  1. __BKPT(0);

które w bibliotekach STM zostało zdefiniowane w następujący sposób:

/**

\brief Breakpoint

\details Causes the processor to enter Debug state.

Debug tools can use this to investigate system state when the instruction at a particular address is reached.

\param [in] value is ignored by the processor.

If required, a debugger can use it to store additional information about the breakpoint.

*/

#define __BKPT(value) __ASM volatile ("bkpt "#value)


Instrukcja BKPT jako argument może przyjmować wartości z zakresu 0 do 255. Wartość oznacza punkt przerwania. Przeważnie stosuje się wartość 0, ten numer nie wpływa na miejsce zatrzymania programu.  Po podłączeniu debuggera następuje zatrzymanie programu w miejscu wywołania instrukcji

Spowoduje ona zatrzymanie programu podczas debugowania w miejscu jej wywołania:


Tak wywołana instrukcja spowoduje każdorazowe zatrzymanie programu w tym miejscu. Kliknięcie przycisku Resume. Spowoduje to ciągłe wpadanie programu w to miejsce, bez możliwości przejścia dalej. 

Jest na to oczywiście sposób, niestety mniej wygodny. Uruchamiamy console Debugger Console i w niej wpisujemy:

  1. set $pc = $pc + 2
  2. continue

Powoduje to przestawienie adresu o dwa bajty oraz uruchomienie programu w wybranym miejscu. Wartość 2 wynika z rozmiaru instrukcji. 



Dosyć ważnym elementem jest stosowanie zabezpieczenia aby te elementy wywoływały się tylko podczas uruchomionego debuga. Jeśli program zostanie uruchomiony normalnie to nastąpi wejście do HardFaulta i program nie przejdzie dalej. 

Np. w taki sposób:

  1. #ifdef DEBUG
  2.     __BKPT(0);
  3. #endif