スキップしてメイン コンテンツに移動

WSL/VSCodeからNuttx/STM32をWindows10上のOpenOCD/ST-LINK経由でgdbデバッグ

NuttXのソースコードに触れているのですが、shell上だけで作業/デバッグするのには限界があり、なにかよい方法はないかと調べたところ、VSCodeにてCortexのデバッグができるようなので、試してみたところ、とりあえず動いており、WSLとWindowsだけでコンフィグ・コンパイルし、ST-LINK経由でデバッグする方法は他には見当たらなかったので、備忘録を兼ねて本稿をUPしてみました。
まず、WSLをインストールします。筆者の場合はWSL2を使っています。次に、VSCodeをインストールしますが、VSCodeの起動はウィンドウズからではなく、WSLのシェルから起動します。 追記:2021/03/16 一番最初の起動は以下の通りです。
$ code .
Installing VS Code Server for x64 (2b9aebd5354a3629c3aba0a5f5df49f43d6689f8)
Downloading: 100%
Unpacking: 100%
Unpacked 1824 files and folders to /home/MyUserID/.vscode-server/bin/2b9aebd5354a3629c3aba0a5f5df49f43d6689f8.
その後の起動は、.vscodeをnuttxのルートに置く場合
$ cd /usr/src/nuttx-9.1.0/nuttx
$ code
で起動できます。起動に成功すると、Windowの左下に(WSL/Debianの場合)
WSL: Debian
と表示されます。
続いてソースコードですが、/mnt/c以下に置くとファイルアクセスが遅いので、WSLからみた/usr/src上にソースを展開します。筆者の場合、前述のように、/usr/src/nuttx-9.1.0/以下にnuttxとappsを置いています。 続いて、wsl上でlinux機と同様にコンパイル環境を整えます。makeやhost用gcc/binutils、target用gcc/binutilsなどをインストールします。これに加えて、menuconfig用にkconfig-frontendsをインストールしてきます。ここまでで、nuttxの作業環境(コンフィグ・コンパイルまで)をlinux機と同じように、wsl上でできるようにしておきます。
次に、Windows上で、OpenOCD, gnu toolchain(arm-none-eabi-xxx等), makeをインストールします。筆者の場合、以下のディレクトリにインストールしています。
OpenOCD:    C:\Devz\OCD
toolchain:  C:\Devz\ARM\gnu
make.exe:   C:\Devz\ARM\gnu\bin
追記:OpenOCDはhttps://gnutoolchains.com/arm-eabi/openocd/ ( https://github.com/sysprogs/openocd )を使っています。
インストール後、windowsのパスをコントロールパネル、システム、システムの詳細設定、環境変数にて通しておいてください。ここまでできていると、WSLではないWindows上での開発環境も同時にできることになります。
さらに、続いて、WSL2から、VSCodeを起動し、マーケットプレースから"Cortex-Debug"をWSL/VSCODEにインストールします。Cortex-Debugをインストールしたら、メニューの"実行"->"構成の追加..."を選ぶと、コマンドパレットに、"cortex-debug"があるので、これを選びます。すると、launch.jsonの編集Windowが開くので、以下の様に記述します。
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Cortex Debug",
            "cwd": "${workspaceRoot}",
            "executable": "/usr/src/nuttx-9.1.0/nuttx/nuttx",
            "request": "launch",
            "type": "cortex-debug",
            "servertype": "openocd",
            "serverpath": "/mnt/c/Devz/OCD/bin/openocd.exe",
            "gdbpath": "/mnt/c/Devz/ARM/gnu/bin/arm-none-eabi-gdb.exe",
            "configFiles": [
                "interface/stlink.cfg",
                "target/stm32f4x.cfg"
            ]
        }
    ]
}
設定が済んだら保存しておきます。
続いて、nuttxのビルドですが、こちらはシェル経由のほうが早いので、tools/configure.sh xxx/yyyでdefconfigを流した後、デバッグ用にmake menuconfigで以下の設定を追加し、makeしておきます。
CONFIG_DEBUG_NOOPT    (Optimization Level (Suppress Optimization)  --->)
CONFIG_DEBUG_SYMBOLS  ([*] Generate Debug Symbols)
これで、デバッグの開始ができるようになっていますので、vscodeから"実行"->"デバッグの開始"で実機デバッグを行います。Windows上のST-LINK経由でプログラムがロードされるとgdbデバッグが開始されますので、あとはお好きなようになさってください。
今回は以上です。それでは。

コメント

このブログの人気の投稿

wsdd を使ってSamba サーバをネットワークに表示

Windows 10のアップデートで、セキュリティー対応のため、smbv1がデフォルトではインストールされなくなり、Samba serverがエクスプローラーのネットワークに表示されなくなってしまいました。そこで、いくつか方法を調べたのですが、linuxでwsdの実装がないか探したところ、 https://github.com/christgau/wsdd が、見つかりましたので、さっそくインストールしてみました。まだパッケージにはないようですが、インストール自身は簡単です。wsdd自体は以下のように取得し、linkを張っておきます。 cd /usr/local/bin/ sudo wget https://raw.githubusercontent.com/christgau/wsdd/master/src/wsdd.py sudo chmod 755 wsdd.py sudo ln -sf wsdd.py wsdd こちらのsambaサーバはDebianなので、/etc/systemd/system/wsdd.serviceは以下のようにしました。 [Unit] Description=Web Services Dynamic Discovery host daemon Requires=network-online.target After=network.target network-online.target multi-user.target [Service] Type=simple ExecStart=/usr/local/bin/wsdd -d MYDOMAIN [Install] WantedBy=multi-user.target wsdd -d MYDOMAINのところを、環境にあわせて書き換えてください。 次に、systemdに登録・起動テストを行います。 systemctl enable wsdd systemctl start wsdd 起動に成功すると、エクスプローラーのネットワークに表示されます。  なおこのwsddはpython3が必要です。一度試してみてください。SMBv1/CIFSを停止していても、大丈夫です。 cで書かれたほかのwsddの実装もあるようなので、いずれパッケージになるかも...

フレッツ光クロス:MAP-E ROUTER by Debian Box (iptables)

フレッツ光クロスがようやく開通したので、Debianにてrouterを構成し接続してみました。なお、プロバイダーを選ぶにあたっては、IPoE方式がそれぞれ異なるため検討したところ、IPoEでは、MAP-Eでもv6plusとocnバーチャルコネクトがあり、前者がポート数240なのに対し、後者は約4倍のポート数が使えるようなネットの情報をみて、OCNバーチャルコネクトを選択しました。(プロバイダーとしてはぷららです。なおDS-LiteはCE側でのNATではないので今回は見送りました。)そこで、OCN バーチャルコネクトをDebian(iptables)で実現するとどうなるかと思い、ネットの情報を頼りにしつつ、設定した次第です。 実際に試した結果、とりあえず通信できていますが、MAP-Eは本来マッピングルールをマップサーバから取得するはずなので、今回のやり方が正解とはいえませんし、仕様変更されると通信できなくなる可能性があります。あくまでも参考程度ですが、本稿をUPしてみました。 2023/03/16追記: こちら にゲームコンソールNAT越え(Nintendo Switch ナットタイプ A判定)対応版を投稿しました。 2023/03/28追記:※1の記述および3行無効化によりNAT越え(Nintendo Switch ナットタイプ B判定)できるようになりました。 構成は以下の通りです。 ルーターがDebianで回線がOCNバーチャルコネクトであること以外はなにも特別なところはない構成です。 さて、いきなり設定ですが、まず、割り当てられたプレフィックスを確認します。 確認は、 dhclient -6 -d -P enp2s0 とします。出力の中に 前略 RCV: | | X-- IAPREFIX 2400:4050:5c71:af00::/56 後略 このようにプレフィックスが表示されるので、その確認したプレフィックスを書き留めておきます。これを こちらで 入力します。すると、 CE: 2400:4050:5c71:af00:99:f171:c600:2f00 IPv4 アドレス: 153.241.113.198 ポート番号:(1776-1791 2800-2815 3824-3839) 4848-4863 5872-5887 6896-...

efibootmgr を使ってブートエントリーを整理する

テスト用に OS を複数回同じ機材にインストールするとEFIブートエントリーが NVRAM に残ったままになり、どれがどれなのかわかりにくくなってしまいます。そこで不要なエントリーをしらべ整理したいと思ったのですが、意外とまとまった記事がなかったので、備忘録として挙げてみることにしました。 まず最初にエントリーを表示させます。 efibootmgr -v BootOrder: 0000,0015,0014,0012,0006,0007,0009,000A,000B,000C,0011 Boot0000* Debian_01 HD(1,GPT,XXXXXXXX-23f7-4f5e-b436-260e5fd276a7,0x800,0x100000)/File(\EFI\DEBIAN\GRUBX64.EFI) Boot0006* UEFI: PXE IP4 Mellanox Network Adapter - 50:6B:WW:WW:XX:XX PciRoot(0x1)/Pci(0x0,0x0)/Pci(0x0,0x0)/MAC(506bWWWWXXXX,1)/IPv4(0.0.0.00.0.0.0,0,0)..BO Boot0007* UEFI: PXE IP4 Mellanox Network Adapter - 50:6B:WW:WW:XX:XX PciRoot(0x1)/Pci(0x0,0x0)/Pci(0x0,0x1)/MAC(506bWWWWXXXX,1)/IPv4(0.0.0.00.0.0.0,0,0)..BO Boot0009* UEFI: PXE IP4 Intel(R) I350 Gigabit Network Connection PciRoot(0x0)/Pci(0x1c,0x0)/Pci(0x0,0x0)/MAC(901bWWWWXXXX,1)/IPv4(0.0.0.00.0.0.0,0,0)..BO Boot000A* UEFI: PXE IP6 Intel(R) I350 Gigabit Network Connection PciRoot(0x0)/Pci(0x1c,0x0)/Pci(0x0,0x0)/MAC(901bWWWWXXXX,1)/IPv6([::]: [::]:,0,0)....