はじめに
Raspberry Pi Pico(Pico)はRaspberry Pi4を使用して、SWDでデバッグすることが推奨されているようだが、
Picoが2台ある場合、そのうち1台にpicoprobe
というプログラムを書き込むことで、デバッガとして使用することができる。
下記のようにPico SDKには必要なものが一式揃っている。
- picoprobeのソースコード
- picoprobe対応のOpenOCD
実のところ以前やったようにPC上でもpico_setup.sh
で環境を構築すると必要なものは全て揃った状態になる。
Getting started with Raspberry Pi Picoを参考に作業する。
作業環境はUbuntu 20.04のPC。
HWの準備
Figure.34の図に従って接続する。
Debugger側 | Debuggee側 | 備考 |
---|---|---|
GND | GND | |
GP2 | SWCLK | |
GP3 | SWDIO | |
GP4/UART1 TX | GP1/UART0 RX | |
GP5/UART1 RX | GP0/UART0 TX | |
VSYS | VSYS | オプション |
udevルールの追加
一般ユーザーでopenocd実行時にError: libusb_open() failed with LIBUSB_ERROR_ACCESS
が出る場合はudevのルールを追加する。
そのためには/etc/udev/rules.d/99-picoprobe.rules
を下記の内容で作成する。
# Raspberry Pi Pico probe ATTRS{idVendor}=="2e8a", ATTRS{idProduct}=="0004", MODE="0666"
下記のコマンドで設定を反映する。
$ sudo udevadm trigger
picoprobeの書き込み
Debuggerにする方のPicoを転送モードでブートし、/media/${USER}/RPI-RP2
がマウントされた状態にする。
picoprobeのプログラムを書き込む。以下はpico_setup.shで構築した環境の場合。
$ cp ${PICO_EXAMPLES_PATH}/../picoprobe/build/picoprobe.uf2 /media/${USER}/RPI-RP2
デバッグの実行
OpenOCD
pico_setup.shで構築した環境の場合、下記のようにするとOpenOCDを起動することができる。
$ cd ${PICO_SDK_PATH}/../openocd $ src/openocd -f interface/picoprobe.cfg -f target/rp2040.cfg -s tcl
gdb
あらかじめgdb-multiarch
パッケージをインストールしておく。
$ sudo apt install gdb-multiarch
例としてblink
を実行する。既にDebuggee側のPicoにblink.uf2
が書き込んであるものとする。
$ cd ${PICO_EXAMPLES_PATH}/build/blink $ gdb-multiarch blink.elf
gdb
のシェルで下記のようにするとデバッグを開始できる。
(gdb) target remote :3333 (gdb) mon reset init (gdb) load
メイン関数にブレークポイントを貼る場合は下記のようにする。
(gdb) b main (gdb) c continuing. Note: automatically using hardware breakpoints for read-only addresses. target halted due to debug-request, current mode: Thread xPSR: 0x01000000 pc: 0x00000178 msp: 0x20041f00 Thread 1 hit Breakpoint 1, main () at /home/mickey/work/rpi_pico/pico/pico-examples/blink/blink.c:9 9 int main()
きちんとブレークすることが確認できる。
gdb初期化ファイルの作成
pico.gdbinit
を下記の内容で作成する。
target remote :3333 mon reset init load
gdbを実行する時に下記のようにする。
$ gdb-multiarch -x pico.gdbinit blink.elf
gdbguiの使用
弊ブログでは毎度同じみのgdbguiでもデバッグできる。
$ pip3 install gdbgui --upgrade --user
ユーザーインストールの場合は、${HOME}/.local/bin
にパスを通す必要がある。
$ cd ${PICO_EXAMPLES_PATH}/build/blink $ gdbgui -g gdb-multiarch ./blink.elf
pico.gdbinit
を使用する場合は下記のようにする。
$ gdbgui -g "gdb-multiarch -x pico.gdbinit blink.elf"
まとめ
picoprobeは十分実用的。