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

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の実装もあるようなので、いずれパッケージになるかもしれませ

Hyper-V Server2019にワークグループ環境下でWindows10(1809)から接続

Hyper-V server 2019に、ワークグループ環境にてWindows10(1809)から接続してみました。Windows10にHyper-V管理ツールがインストールされていることと、Hyper-V Serverをインストール済であることが前提です。以下、Hyper-V serverは名前がHyperVSV、アドレスは192.168.1.110としています。 まず、Hyper-V server上で、powershellを起動し、以下のコマンドを入力します。 Enable-WSManCredSSP -Role Server -Force 続いて、クライアントのWindows10のpowershell で以下のコマンドを入力します。 winrm quickconfig -Force Enable-WSManCredSSP -Role Client -DelegateComputer * -Force さらに、クライアントマシンで、gpedit(グループポリシーエディタ)を起動し、以下の要領でポリシーを設定します。 a. [コンピューターの構成]->[管理テンプレート]->[システム]->[資格情報の委任]->[NTLMのみのサーバー認証で新しい資格情報の委任を許可する] を有効にし、サーバを一覧に追加[表示...]ボタンをクリックして、「WSMAN/*」を追加 b. [コンピューターの構成]->[管理テンプレート]->[システム]->[資格情報の委任]->[NTLM のみのサーバー認証で保存された資格情報の委任を許可する] を有効にし、サーバを一覧に追加[表示...]ボタンをクリックして、「*」を追加 また、名前解決できるように、(notepadを管理者権限で実行し)C:\Windows\System32\Drivers\etc\hostsにサーバ名とIPアドレスの対を追加。 192.168.1.110 HyperVSV 最後に、Hyper-Vマネージャーを起動し、Windows10からHyper-V サーバに接続します。手順は以下の通りです。 「サーバーに接続」->コンピュータの選択->別のコンピューターに[HyperVSV]と入力し、[別のユーザーとして接続する

フレッツ光クロス: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-