Debugowanie programu dla Raspberry Pi Pico jest dość skomplikowane. Należy użyć programu OpenOCD, który używa sondy sprzętowej w postaci drugiego Pi Pico podpiętego do debugownego Pi Pico. Aby Pi Pico stało się sondą sprzętową należy uruchomić na nim picoprobe. Program OpenOCD pełni funkcję servera gdb i komunikuje się z sondą (picoprobe) przez interface USB. Do niedawna, użycie OpenOCD w systemie Windows z sondą podłączoną przez usb, wymagało zainstalowania specjalnych sterowników libusb (np. zadig). Z tymi sterownikami bywały różne problemy - szczególnie, gdy konfiguruje się je wielokrotnie pracując z różnymi układami. Na szczęście ostatnie zmiany w picoproble związane z implementacją CMSIS-DAP eliminują potrzebę używania dodatkowego sterownika dzięki zastosowaniu USB-HID.
Schemat połączeń pochodzi z podręcznika Getting started with Raspberry Pi Pico
W przypadku zastosowania podsystemu WSL w procesie programowania Pi Pico konfiguracja środowiska składa się z kilku kroków.
Przygotowanie picoprobe przebiega w sposób standardowy. Należy skompilować ze źródeł w repozytorium lub pobrać wydaną wersję. (Uzupełnienie: jak skompilować wersję ze źródeł).
Przygotowanie OpenOCD jest trudniejsze. Skompilowanie właściwej wersji wymaga odpowiedniego środowiska np. MSYS2. Cały proces opisany jest w dodatku A podręcznika Getting started with Raspberry Pi Pico. Można także skorzystać z wersji już skompilowanej - są takowe dostępne w internecie (np. VisualGDB).
OpenOCD uruchamia się bezpośrednio w systemie Windows (nie w WSL). Należy skonfigurować nasłuchiwanie na dowolnym adresie IP (nie tylko localhost
) przez użycie komendy bindto
. Przykładowe wywołanie (dla MINGW64):
src/openocd -f interface/cmsis-dap.cfg -c "adapter speed 5000" -f target/rp2040.cfg -s tcl -c "bindto 0.0.0.0"
Po połączeniu Pi Pico do układu debugowanego i portu usb oraz uruchomieniu OpenOCD można przystąpić do uruchomienia środowiska wewnątrz WSL. Jeśli jeszcze nie został zainstalowany to należy zainstalować w Visual Studio Code dodatek Cortex-Debug.
Moja konfiguracja w .vscode/launch.json
jest następująca:
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug",
"cwd": "${workspaceRoot}/build",
"executable": "${command:cmake.launchTargetPath}",
"request": "launch",
"type": "cortex-debug",
"servertype": "external",
"gdbPath": "/usr/bin/gdb-multiarch",
"gdbTarget": "192.168.1.100:3333",
"showDevDebugOutput": "raw"
}
]
}
Parametr gdbTarget
powinien zawierać adres IP maszyny, na której uruchomiono OpenOCD.
Należy zwrócić także uwagę, czy w debugowanym projekcie w CMakeLists.txt
jest włączone pico_enable_stdio_uart
(przez ustawienie na 1
).