みつきんのメモ

組み込みエンジニアです。Interface誌で「My オリジナルLinuxの作り方」連載中

Ubuntu 20.04のPCでRaspberry Pi Picoを2台使ってOpenOCDによるデバッグ

はじめに

Raspberry Pi Pico(Pico)はRaspberry Pi4を使用して、SWDでデバッグすることが推奨されているようだが、 Picoが2台ある場合、そのうち1台にpicoprobeというプログラムを書き込むことで、デバッガとして使用することができる。

下記のようにPico SDKには必要なものが一式揃っている。

  1. picoprobeのソースコード
  2. picoprobe対応のOpenOCD

実のところ以前やったようにPC上でもpico_setup.shで環境を構築すると必要なものは全て揃った状態になる。

Getting started with Raspberry Pi Picoを参考に作業する。

作業環境はUbuntu 20.04のPC。

HWの準備

Figure.34の図に従って接続する。

f:id:mickey_happygolucky:20210218234957p:plain
2台のPicoの接続

Debugger側 Debuggee側 備考
GND GND
GP2 SWCLK
GP3 SWDIO
GP4/UART1 TX GP1/UART0 RX
GP5/UART1 RX GP0/UART0 TX
VSYS VSYS オプション

f:id:mickey_happygolucky:20210218235501j:plain
接続の様子

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は十分実用的。