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](https://www.google.com/search?q=getting-started-with-pico.pdf&rlz=1C1ASRM_enJP847JP847&oq=getting-started-with-pico.pdf&aqs=chrome..69i57.1199j0j15&sourceid=chrome&ie=UTF-8)」の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](https://www.google.com/search?q=getting-started-with-pico.pdf&rlz=1C1ASRM_enJP847JP847&oq=getting-started-with-pico.pdf&aqs=chrome..69i57.1199j0j15&sourceid=chrome&ie=UTF-8)」のAppendix A.1.2に記載してありますが、これがすんないりとはいきません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337553/dfd5d915-98ff-bb7e-aa59-e321a07b58d1.png)


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

- OpenOCD
OpenOCDをビルドする環境として、まずMSYS2をインストールしろと公式ガイドに記載してありますが、結論からすると現状(2月初旬)の[公式GitHub](https://github.com/raspberrypi/openocd.git) をクローンしてビルドしても動作しません。（そのままでは。。。）
Liam Fraser氏が[正常動作するOpenOCD](https://drive.google.com/file/d/1SgZJepJWYQqCeC7m8se-yJLK9sv_AH8n/view)を公開されていますので、こちらをダウンロードして使うのが手っ取り早いです。 


- Picoprobe driver
Picoprobe化されたPicoは、PCから見るとUSBの複合デバイスとして認識されます。1つはCDC UART、もう一つはデバッグ用のSWDインタフェースで、これはベンダユニーククラスです。
ベンダユニーククラス用のWindowsドライバとして、[Zadig](http://zadig.akeo.ie)を使って設定することが想定されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337553/7e5dcd8f-5a0a-e44f-e683-9fa52de00f20.png)

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」をタイプすると教えてくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337553/1a76e9db-9547-f403-13e8-b6a8db44b9e1.png)

- 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"
                ],
            }
        ]
    }
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337553/3190b157-3c9b-8871-7ace-dba72be0d009.png)


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