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:
- __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
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:
- set $pc = $pc + 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:
- #ifdef DEBUG
- __BKPT(0);
- #endif