Raspberry Pi Pico W(SDK) を RaspberryPi3 + Visual Studio CodeでSWDデバッグ

Raspberry Pi Pico W の SDK を使用したプログラムをRaspberryPi3 + Visual Studio CodeでSWDデバッグする

概要

Raspberry Pi Pico W の SDK を使用したプログラムをRaspberryPi3 + Visual Studio CodeでSWDデバッグするときのメモ。

[!NOTE] RaspberryPi4 や Pi ZERO 2 W でも同様だと思うが、実際に試したのが Pi3 だったので。
たぶん Pi ZERO や Pi2 ではやめておいた方が無難。
Pi ZERO 2 W やRAM512KByteだからビミョーかも…

公式ドキュメントサイト
公式スタートアップガイド(日本語版)
公式スタートアップガイド

試したときはRaspberryPi OS Lite(64bit) 使用(通常版でも大丈夫と思う)。

RaspberryPi3のセットアップ

RaspberryPi3をセットアップします。
Visual Studio Code で リモートSSH接続するので、SSHが公開鍵認証で接続できるようにしておくこと。
セットアップの手順は Raspberry Pi OS(64bit)のインストール(Raspberry Pi Imager) など参照。

[!NOTE] ターゲットボードにPico W を使用する場合はボード種別を指定しておくこと

echo "export PICO_BOARD=pico_w" >> ~/.bashrc
source ~/.bashrc

セットアップスクリプトの実行

公式ドキュメントに記載されている通り、セットアップスクリプトを実行すればセットアップはほぼ自動です。
ただし、今回はVisual Studio CodeをRaspberryPi上ではなく、WindowsPC上で動かし、 リモートSSHでRaspberryPiに接続する方法をとるので、Visual Studio Codeのインストールは不要です。
また、私はRaspberryPiのシリアルコンソールを残しておきたいので、UARTのセットアップも行いません。
(UARTは別途USB-Serialアダプタを使用して接続)

以下のようにセットアップスクリプトを実行します。
今回は/workディレクトリにインストールすることにしています。
別のディレクトリにインストールする場合は読み替えてください。

cd /work

# スクリプトダウンロード
wget https://raw.githubusercontent.com/raspberrypi/pico-setup/master/pico_setup.sh 

# VSCODEのインストールとUARTの設定をスキップしてセットアップ
SKIP_VSCODE=1 SKIP_UART=1 bash pico_setup.sh

[!NOTE] openOCDのコンパイルとかで時間がかかるので(私が試したときは30分くらい)、
お茶でも飲んでのんびりお待ちくらはい。

セットアップスクリプト後の変更

セットアップスクリプトでサンプルプログラムを一部ビルドしてくれますが、 Visual Studio Code上の開発環境で作り直すのでpico-examples/buildディレクトリは削除しておいてください。

rm -fr /work/pico/pico-examples/build

また、Visual Studio Codeの設定ファイルをpico-examples/.vscodeディレクトリに作成しておきます。

cd /work/pico/pico-examples
mkdir .vscode
cp ide/vscode/launch-raspberrypi-swd.json .vscode/launch.json
cp ide/vscode/settings.json .vscode/settings.json

このままだとビルドが全ビルドになってしまい、時間がかかってしまうのでビルドターゲットを指定できるように変更しておきます。
【2024.08.29修正】 どこかのタイミングのバージョンアップで設定できる内容が大幅に変更されたようなので、setting.jsonを以下の内容で全書き換えしておきます。

settings.json

{
  "cmake.configureOnOpen": false,
  "cmake.options.statusBarVisibility": "visible",
  "cmake.options.advanced": {
    "build": {
        "statusBarVisibility": "visible",
        "projectStatusVisibility": "visible"
    },
    "buildTarget": { 
        "statusBarVisibility": "visible",
        "projectStatusVisibility": "visible"
    }, 
    "ctest": { 
        "statusBarVisibility": "hidden",
        "projectStatusVisibility": "hidden" 
    }, 
    "debug": { 
        "statusBarVisibility": "hidden",
        "projectStatusVisibility": "hidden" 
    },
    "launchTarget": { 
        "statusBarVisibility": "hidden",
        "projectStatusVisibility": "hidden" 
    },
     "launch": {
        "statusBarVisibility": "hidden",
        "projectStatusVisibility": "hidden" 
    },
    "workflow": {
        "statusBarVisibility": "hidden",
        "projectStatusVisibility": "hidden" 
    },
    "cpack": {
        "statusBarVisibility": "hidden",
        "projectStatusVisibility": "hidden" 
    }    
  },
}

Raspberry Pi3とRaspberry Pi Pico の接続

この辺で一旦Raspberry Pi3をシャットダウンし、Raspberry Pi Picoと接続します(最初に接続しておいても良いけど)。
接続方法は 公式スタートアップガイド の 「Chapter 5. Flash Programming with SWD」の下の「5.2. SWD Port Wiring」 あたりを参照してください。
私はPicoのシリアルポートをRaspberryPiではなくUSB-Serialに接続するようにしたので、図の上3本の結線は行わず Pi3のGPIO24とPicoのSWDIO、Pi3のGPIO25とPicoのSWDCLK、双方のGND同士 の3本を結線しました。
(PicoのPin1~3はUSB-Serialに接続し、WindowsPCかRaspberry Pi3に接続)

Visual Studio COCE 起動&フォルダのオープン

ホストPCでVisual Studio COCE 起動。
リモートSSHでRaspberryPi3 に接続し、セットアップツールでインストールした サンプルプログラムのディレクトリを開きます(上の例では/work/pico/pico-example)

拡張機能のインストール

これは最初の起動時のみ実行します。

拡張機能で「Cmake Tools」「C/C++(C/C++ for Visual Studio Code)」「Cortex Debug」をRaspberry Pi3 にインストールします。
(ホストPCではないのでSSH接続した後でインストールすること)

「Cmake Tools」のインストールが完了したら歯車アイコン(設定)をクリックして設定画面を開き、 “CMake: Parallel Jobs” の設定値を0から1(または2)に変更 (0だと設定できる上限値になるはずだけど、プロセッサ数4に対して6が設定されてしまい、システムがハングアップしてしまうことがあるので)

右下に「プロジェクト”pico-examples”を構成しますか? ソース:CMake Tools(拡張機能)」と表示されるのでYesをクリック
続いて「プロジェクトを開いたときに常に構成しますか? ソース:CMake Tools(拡張機能)」 と表示されるので「はい」をクリック

ビルド~デバッグ

ステータスバーの「キットが選択されていません」をクリックすると ウィンドウ上部に「pico-examplesのキットを選択してください」と表示されるので 「GCC 12.2.1 arm-none-eabi」を選択(バージョンは異なるかも)

[!NOTE] 「この大規模なワークスペース フォルダーでのファイルの変更をウォッチできません。 この問題を解決するには、手順のリンクに従ってください。 」 と表示された場合 /etc/sysctl.conf に以下を追記

fs.inotify.max_user_watches = 524288

設定を反映

sudo sysctl -p

ステータスバーで「プロジェクトを構成しています: pico-examples」が消えるのを待つ)

ステータスバーで「既定のビルドターゲットの設定(ステータスバーの表示にマウスカーソルをあてると表示されるメッセージ)」と 「起動するターゲットを選択します(ステータスバーの表示にマウスカーソルをあてると表示されるメッセージ)」を クリックしてデバッグしたいターゲットに設定します(例えば、picow_blink)。 これらば同じターゲットを指定する必要があります。(ビルドターゲットはallでも良いが、ビルドに時間がかかる)

[!NOTE] サンプルにあるide/vscode/settings.json そのままだと「既定のビルドターゲットの設定」がallのまま変更できないのでビルドに時間がかかるため 上記の変更を行っています。

構成が完了したら「実行とデバッグ」ウィンドウを開いて、右向き三角マーク(デバッグの開始)をクリック
(右向き三角マーク(デバッグの開始)が無ければ「実行とデバッグ」をクリック)
buildが始まって、終わったらデバッガが起動します。
あとは他のデバッグ同様、RUNやSTEPなどでデバッグしてください。

自作プロジェクトの作成

サンプルプログラムを改造してうんぬんするのはダサいだけでなく、関係ない処理が色々動いて ビルドに時間がかかるので、自作プロジェクトの作成をした方が良いです。

Raspberry Pi Pico W で SDK の「自作プロジェクトの作成」にまとめておきましたが、デバッガの指定など追加手順もあるので 再掲します。

プロジェクト生成ツールのインストール

プロジェクト生成ツールをインストールして起動スクリプトを作成します。

# ダウンロード
cd /work/pico/
git clone https://github.com/raspberrypi/pico-project-generator.git

# 起動用スクリプトの作成
mkdir -p ~/bin
cat > ~/bin/pico_project << "_EOF_"
/work/Pico/pico-project-generator/pico_project.py --nouart --usb  --gui &
_EOF_

chmod +x ~/bin/pico_project

# tkinter のインストール(RaspberryPi OS lite の場合は要インストール)
sudo apt-get install python3-tk

[!NOTE] それまで~/binが存在していない場合は一旦ログアウトして再ログインで ~/binにpathを通す(変数ゴチョゴチョやっても良いけど、再ログインが手っ取り早い)。

プロジェクト生成ツールの起動~プロジェクト出力

リモート接続で使用している場合はDISPLAY変数が設定されていること(ホストマシン)と、 ホストマシンでX-serverが動作していることを確認し、 プロジェクト生成ツール起動スクリプトを実行します。

pico_project

ホストマシン上にプロジェクト生成ツールのウィンドウが表示されます。

各パラメータを設定し、OKボタンをクリックしてプロジェクトを生成します。
このウィンドウで必要な設定を行います。

OKボタンをクリックしたらプロジェクトが作成され、cmakeが実行されます。
実行結果を表示するウィンドウが表示されますので、確認してOKボタンでクローズしてください。

プロジェクト生成ツールはもう不要なのでクローズしてください。

生成されたプロジェクトディレクトリの.vscode/settings.json を以下の内容で全書き換えします。

settings.json

{
  "cmake.configureOnOpen": false,
  "cmake.options.statusBarVisibility": "visible",
  "cmake.options.advanced": {
    "build": {
        "statusBarVisibility": "visible",
        "projectStatusVisibility": "visible"
    },
    "buildTarget": { 
        "statusBarVisibility": "visible",
        "projectStatusVisibility": "visible"
    }, 
    "ctest": { 
        "statusBarVisibility": "hidden",
        "projectStatusVisibility": "hidden" 
    }, 
    "debug": { 
        "statusBarVisibility": "hidden",
        "projectStatusVisibility": "hidden" 
    },
    "launchTarget": { 
        "statusBarVisibility": "hidden",
        "projectStatusVisibility": "hidden" 
    },
     "launch": {
        "statusBarVisibility": "hidden",
        "projectStatusVisibility": "hidden" 
    },
    "workflow": {
        "statusBarVisibility": "hidden",
        "projectStatusVisibility": "hidden" 
    },
    "cpack": {
        "statusBarVisibility": "hidden",
        "projectStatusVisibility": "hidden" 
    }    
  },
}

[!NOTE] 毎回修正するのが面倒なら、pico_project.pyの 関数generateProjectFiles内の変数s1の定義(1195行目あたり) を上記の内容で書き換えてしまえば生成時にこの内容にできる。
(そのうち公式さんが修正するだろうけど)

Visual Studio Code でプロジェクトを開く~デバッグ

Visual Studio Code のリモートエクスプローラからRaspberry Pi に接続し、作成したディレクトリを開きます。

ProjectNameで指定した名前.c が生成されているので必要な変更を行います。
ファイルを追加する場合は CMakeLists.txt の修正も忘れずに。

ステータスバーの「キットが選択されていません」をクリックすると 上に「XXXXのキットを選択してください」と表示されるので 「GCC 12.2.1 arm-none-eabi」を選択(バージョンは異なるかも)
構成が完了したら「実行とデバッグ」ウィンドウを開いて、右向き三角マーク(デバッグの開始)をクリック
(右向き三角マーク(デバッグの開始)が無ければ「実行とデバッグ」をクリック)
上中央に「ターゲットの起動対象を選択します」と表示されるので、プロジェクト名で指定した名前を選択します。

コンパイルが始まり、エラーがなければそのままデバッガが起動し、main関数の先頭でbreakします。

あとは普通にデバッグしてくらはい。

ソースファイルの追加

ソースファイルを追加する場合はCMakeLists.txtadd_executableに追加するソースファイルを追加します。

変更前

add_executable(test1 test1.c)

変更後

add_executable(test1 test1.c sub.c)