💻

VSCode拡張機能`Raspberry Pi Pico`の中身

2024/08/31に公開

前回、VSCode拡張機能Raspberry Pi Picoを使って楽に開発できるようになった投稿をしました。
https://zenn.dev/usagi1975/articles/2024-08-29-000_pico_development

そもそも、Pico向けのC/C++開発は、どういう構成で開発させているのかを、自分メモとしても残しておきます。

VSCode拡張機能Raspberry Pi Picoが裏でやっていること

コンソールに出力されている内容をみると、拡張機能をインストールすると以下に一式必要なファイルやモジュールをDLします。

%USERPROFILE%\.pico-sdk

.pico-sdkの内容は以下のとおり。

ツール 内容
cmake Picoのプログラム構成を定義してそこからMakefileを生成するツール。
examples サンプル。https://github.com/raspberrypi/pico-examples.git がクローン
ninja cmakeのジェネレータ。Windows版だとninjaが使われている。
openocd OpenOCD (Open On-Chip Debugger) は、組み込みシステムのデバッグやプログラムのフラッシュに使われるオープンソースのデバッグツール。
picotool https://github.com/raspberrypi/picotool のリリース2.0.0をDLしている。
python cmakeで使われるPython確認時では、3.12.1がコピーされている。
sdk バージョンフォルダ配下に、pico-sdkの本体がhttps://github.com/raspberrypi/pico-sdk.gitがクローンされている。
toolchain Arm GNU Toolchainで、確認時は13_2_Rel1で、多分ここから https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads/13-2-rel1 ダウンロードされている。
tools 確認時はpioasm.exeのみ。PIO用のアセンブリコードをバイナリ形式に変換するためのツールらしい。

で、上記の場所は、VSCodeの変数${userHome}でユーザプロファイルの場所を起点として、以下のようにツールの場所を特定している。

${userHome}/.pico-sdk/toolchain/13_2_Rel1/bin/arm-none-eabi-gcc.exe
${userHome}/.pico-sdk/openocd/0.12.0+dev/openocd.exe
${userHome}/.pico-sdk/cmake/v3.28.6/bin/cmake
${env:HOME}/.pico-sdk/picotool/2.0.0/picotool/picotool

ちなみに、この拡張機能は下図のようにC/C++開発によく使われるほかの拡張機能に依存してます。

開発の流れ

英語版の最新PDFには、拡張機能使う前提なのか、手動でファイルを作成する手順がなくなってます。日本語版の古い情報にはかろうじて残っていて、この拡張機能がその手順を自動化している感じで動作してます。

https://datasheets.raspberrypi.com/pico/getting-started-with-pico-JP.pdf

第章 8. プロジェクトを作成するのところを参照。概ねこの流れを簡単にやれるようになっているわけです。

前提

  1. 上記のツール類がそろっていて、パスが特定できている。
  2. pico-sdkやpico-examplesを入手済み

プロジェクトの作成

  1. プロジェクト用のフォルダを作成してソースをコピーする
  2. CMakeLists.txtをソースと同じ場所に作成して、必要な構成を定義する
  3. SDKを使えるようにするpico_sdk_import.cmakeファイルをSDKからコピーして持ってくる
project
├ test.c
├ CMakeLists.txt
└ pico_sdk_import.cmake
  1. CMakeLists.txtをもとに、cmakeを実行して、ninja向けのビルド用ファイルをbuildフォルダ以下に生成する
  2. ninjaを実行してモジュール類(*.uf2, *.elf)を作成する
> cd project
> mkdir build
> cd build
> cmake -G Ninja ..
> ninja
> ls *.uf2 *.elf
blink.elf*  blink.uf2*

OpenOCDを使ってデバッグ

実際のパラメータはもっと多いですが、概ね以下と同じことしてます。これで、OpenOCDを裏でターミナル上で起動します。

> openocd -f interface/cmsis-dap.cfg -f target/rp2040.cfg -s tcl \
  -c "adapter speed 5000"

起動したOpenOCDに対して、デバッグするblink.elfをアタッチする。

> arm-none-eabi-gdb.exe blink.elf

日本語版PDFの6.3. GDB と OpenOCD を使用して Hello World プログラムをデバッグするあたりを参照。これでブレークポイントを付与したり、ステップ実行できるようになります。

OpenOCDを使って、Picoにフラッシュする

実際のパラメータは微妙に違いますが、概ね以下と同じことしてます。

> openocd -f interface/cmsis-dap.cfg -f target/rp2040.cfg \
  -c "program blink.elf verify reset exit"

VSCodeの設定

プロジェクト毎に.vscodeフォルダを作成して設定を定義します。

.vscodeファイル 内容
c_cpp_properties.json C/C++拡張機能を使った設定で、コンパイラのパラメータやパスを定義
cmake-kits.json ??
extensions.json ??
launch.json デバッグ実行時に利用するOpenOCD向けの起動設定
settings.json ターミナル、cmake、本拡張機能向けのパスの設定
tasks.json Compile Project、Run Project、Flashのコマンド設定

中身を見ると、プロジェクト毎の固有の設定がないので、新規作成したプロジェクトのこれらのファイルはみんな同じかもしれない?と思います。

これらも、この拡張機能がなかったときは、PDFマニュアル等を参考にして自分で作成していました。私はデバッグ実行方法が分からなくて、結構時間を費やしてました。

Discussion