Raspberry Pi PicoのGDBデバッグ環境をWindows 10ネイティブ環境に構築する


はじめに

ブームにのって、Rasyberry Pi Picoを5個ほど購入してみました。
公式ドキュメントがよくできているので、本家のRaspberry Pi 4への開発環境構築は簡単にできたので、普段使いのWindows 10環境にGDBのデバッグ環境を含め構築しようとしたところ、はまりどころ満載だったのでメモとして残します。
各プラットフォーム別の構築難易度は以下のイメージです。(あくまで個人の感想です)

 Raspberry Pi > Mac OS > Windows + WSL >> Windows

Toolchainのインストール

基本的に公式ガイド「getting-started-with-pico.pdf」の8.2節に従ってインストールできます。
なんでARM GCC compilerをインストールしたのに、Visual Studio 2019が必要なのという疑問はあとで理由がわかります。

  • ARM GCC compiler
  • CMake
  • Build Tools for Visual Studio 2019
  • Python 3.7
  • Git

GDBのインストール

Raspberry Pi PicoをPicoprobe(USB → SWD and UART converter)とすることにより、2台のPicoを使用してGDBによるデバッグを行うことができます。これはぜひ使いたい!
基本的なインストール方法は、公式ガイド「getting-started-with-pico.pdf」のAppendix A.1.2に記載してありますが、これがすんないりとはいきません。

インストールが必要なツールは以下になります。

  • OpenOCD
    OpenOCDをビルドする環境として、まずMSYS2をインストールしろと公式ガイドに記載してありますが、結論からすると現状(2月初旬)の公式GitHub をクローンしてビルドしても動作しません。(そのままでは。。。)
    Liam Fraser氏が正常動作するOpenOCDを公開されていますので、こちらをダウンロードして使うのが手っ取り早いです。

  • Picoprobe driver
    Picoprobe化されたPicoは、PCから見るとUSBの複合デバイスとして認識されます。1つはCDC UART、もう一つはデバッグ用のSWDインタフェースで、これはベンダユニーククラスです。
    ベンダユニーククラス用のWindowsドライバとして、Zadigを使って設定することが想定されています。

Zadigで割り当てるUSBドライバですが、公式では、libusb-win32を使うことになっていますが、先のOpenOCDを自力でビルドした場合、この設定では動かないようです。(DriverにWinUSB (v6.1.7600.16385)を指定すれば動くという情報あり!)
Liam Fraser氏のOpenOCDビルド版では、公式ガイドの通りの設定でOKです。

VScodeの設定

  • path設定

公式ガイドでは、VScodeの起動は、Visual Studio2019のDeveloper Command Prompt for VS 2019から起動するように記載してあります。
VS2019の環境を使うことが前提となっているように見えますが、真の目的はどうやらVC2019のnmake.exeを使いたいだけのようです。
ということで、環境変数にnmake.exeのpathを設定しましょう。普通にVScodeを起動してもデバッグできるようになります。
nmake.exeのpathは、Developer Command Prompt for VS 2019から、「where nmake.exe」をタイプすると教えてくれます。

  • settings.json

setting.jsonに必要な記載を以下に示します。
どうもwindows版のパス名の指定がスラッシュだったり、バックスラッシュだったり一貫性がないですね。

# settings.json
    {
        "terminal.integrated.shell.windows": "C:\\Program Files\\Git\\bin\\bash.exe",
        "git.autofetch": true,
        "explorer.confirmDelete": false,
        "diffEditor.renderSideBySide": true,
        "cmake.configureOnOpen": true,
        "window.zoomLevel": 0,
        "git.enableSmartCommit": true,
        "cmake.configureEnvironment": {
            "PICO_SDK_PATH": "..\\..\\pico-sdk"
        },
        "cmake.generator": "NMake Makefiles",
        "cortex-debug.gdbPath": "arm-none-eabi-gdb",
        "cortex-debug.openocdPath": "D:/src/pico/Downloads/openocd_picoprobe/openocd.exe",
    }
  • launch.json

launch.jsonに必要な記載を以下に示します。
絶対パスか相対パスかもポイントです。正解がよくわかりませんがとりあえず動いている例です。

# launch.json
    {
        "version": "0.2.0",
        "configurations": [
            {
                "name": "Pico Debug",
                "cwd": "${workspaceRoot}",
                "executable": "${command:cmake.launchTargetPath}",
                "request": "launch",
                "type": "cortex-debug",
                "servertype": "openocd",
                // This may need to be arm-none-eabi-gdb depending on your system
                "gdbPath" : "arm-none-eabi-gdb.exe",
                "device": "pico2040",
                "configFiles": [
                    "interface/picoprobe.cfg",
                    "target/rp2040.cfg"
                ],
                "searchDir": ["D:/src/pico/Downloads/openocd_picoprobe/tcl"],
                "svdFile": "D:/src/pico/Downloads/pico-sdk/src/rp2040/hardware_regs/rp2040.svd",
                "runToMain": true,
                // Work around for stopping at main on restart
                "postRestartCommands": [
                    "break main",
                    "continue"
                ],
            }
        ]
    }

参考サイト

参考になったのは以下のサイトの記事です。
https://www.element14.com/community/community/raspberry-pi/blog/2021/02/07/debugging-the-raspberry-pi-pico-on-windows-10