Raspberry Pi PicoとJ-Link
特に、これで何か作りたいって訳ではないけど、スイッチサイエンスさんでポチってたRaspberry Pi Picoを少し時間が出来たので触ってみました。
前提
ここでは、C/C++での開発を想定してます。
この内容は2021年7月末〜8月頭に試した内容です。
OSはPop! OS 21.4です。
pico-sdkとpico-examplesはgitからcloneして、コンソールでcmadkeできるとこまでは省略してます。
RasPi Picoへのファームの書き込み方法
RasPi Picoのファームの書き換え方法は、ボード上のBOOTSELボタンを押して、リセットした後にマウントされるボリュームに.uf2ファイルをドラッグ&ドロップする方法。公式のドキュメントでも、この方法がまず最初に書かれてる。
Picoで軽く遊ぶ程度なら、これで全然OK。exampleをちょっと試してみたいとかね。
んで、お次に書かれてるのが、通常のRaspberry Pi経由でSWDで書き込む方法。うん、気持ちは分かる。Raspberry Piでコーディングとビルドも出来るよね。でもさ、やっぱPCで作業したいじゃん。
SWDのピン出てるし、J-Link使える?
PCからJLink経由でファームの書き込みとデバッグまで出来たら、開発効率は良いよね。ちょっと混み入ったデバッグも何とかなりそう。で、ググると先人がおりました。
Raspberry Pi Pico J-LlinkでOpenOCD
基本的には、上記の記事の流れそのままでOpenOCDからgdbまで成功しました。この記事が2021年2月に書かれたものだったので、OpenOCDの実行でコケるエラーの修正はマージ済みかと思ったら、7月末の時点でもマージされておらず、手元でパッチを当てました(大した行数じゃなかったので手作業で)。
ちなみに、上記の記事だとOpenOCDのインストールについては特に何も書かれてないですが、公式のGetting Startedを参考に
code: Install OpenOCD for Pico
$ cd ~/pico
$ sudo apt install automake autoconf build-essential texinfo libtool libftdi-dev libusb-1.0-0-
dev
$ git clone https://github.com/raspberrypi/openocd.git --recursive --branch rp2040 --depth=1
$ cd openocd
$ ./bootstrap
$ ./configure --enable-ftdi --enable-sysfsgpio --enable-bcm2835gpio
$ make -j4
としました。ドキュメントだとこの後にsudo make installしてますが、既にPC(Pop! OS 21.4)にインストール済みのOpenOCDが使えなくなると本業の方で変な汗かいたり、無駄に時間解かしてしまう恐れあるので、makeまで。Pico用のOpenOCDを使うときは、~/pico/openocd/src/openocdを使うようにしています。
これでインストールしたOpenOCDを実行すると、記事と同様のエラーが出てくるので、パッチを当ててmakeし直して、再実行すると上手くいきました。
VSCodeで開発&デバッグできる?
コンソールからは、OpenOCDとgdbを実行してデバッグできることが確認できましたが、現代人なのでVSCode使ってコーディングからビルドして、ブレークポイント張ってとかやりたいですよね、はい、その気持ち分かります。
公式のドキュメントにRasPi上でVSCodeをインストールして、OpenOCDとか全部まとめて面倒見てもらう手順が載っているので、これをベースにJ-Linkでも出来ないかやってみます。
まずはVSCodeでデバッグするのに必要な拡張機能をインストール。
code: Install vscode extensions
$ code --install-extension marus25.cortex-debug
$ code --install-extension ms-vscode.cmake-tools
$ code --install-extension ms-vscode.cpptools
この後、VSCodeでpico-exampleディレクトリを開いて、コンパイラにarm-none-eabi-gccを指定。
https://gyazo.com/031e4794fb8ee5da5db47fc68e6945c8
pico-examplesにはVSCodeでビルドからSWDでのデバッグしたりするための設定ファイルも入っているので、
code: vscode-build-setting
cd ~/pico/pico-examples
mkdir .vscode
cp ide/vscode/launch-raspberrypi-swd.json .vscode/launch.json
cp ide/vscode/settings.json .vscode/settings.json
として、自分で作った.vscodeディレクトリの下にコピーしてあげる。J-Linkが使えるように、settings.jsonを次のように書き換える。
code: settings.json
{
"version": "0.2.0",
"configurations": [
{
"name": "Pico Debug",
"cwd": "${workspaceRoot}",
"executable": "${command:cmake.launchTargetPath}",
"request": "launch",
"type": "cortex-debug",
"servertype": "openocd",
"serverpath": "~/pico/openocd/src/openocd",
// This may need to be arm-none-eabi-gdb depending on your system
"gdbPath" : "gdb-multiarch",
"device": "RP2040",
"interface": "swd",
"configFiles": [
"pico-jlink.cfg"
//"target/rp2040.cfg"
],
"searchDir": "~/pico/openocd/tcl",
"svdFile": "${env:PICO_SDK_PATH}/src/rp2040/hardware_regs/rp2040.svd",
"runToMain": true,
// Work around for stopping at main on restart
"postRestartCommands": [
"break main",
"continue"
]
}
]
}
んで、Pico Debugをクリックしてビルド。
https://gyazo.com/614b6b00959481ba08e5dc5fbf73896f
無事にビルド、書き込み、mainの頭で一旦、ブレークして止まる。もちろん、マウスクリックでブレークポイントを張れちゃう。
https://gyazo.com/1dfd3ddb9e7ac367e89799d1c8309922
Vimでも出来たらなー
ここ1〜2年はVimが楽しくなってしまったため、同じことをVimでやれたらなーと調べたら、Vim 8.1以降で標準機能として入っているTermdebugという機能を使えばVimからgdbが起動出来るらしい。ということで、試してみた。
code: vim setting
packadd termdebug
set mouse=a
let g:termdebugger="gdb-multiarch"
let g:termdebug_wide=160
これらをvimの設定ファイルに良きところに追記しておく。
あとは、先にコンソールからOpenOCDを実行しておいて、vimから:Termdebug ../build/blink/blink.elfという感じにしてあげると
https://gyazo.com/6b6f591b0734108df77335d7bc0e6b9d
ってな具合で、Vimからもアレコレできそう。
Vimでのデバッグ効率を上げるための細かい設定とかは追々・・・。