Visual Studio Codeでmbed OSプログラムをデバッグする方法(STM32)

以前、Visual Studio Codeでmbed OSをデバッグする方法を試していました。

matsujirushi.hatenablog.jp

matsujirushi.hatenablog.jp

OCDにpyOCDとOpenOCDの2種類ありますが、OpenOCDの方(対象がSTM32のときに使う)はGDBサーバーの自動起動がうまくできなくて、その後、Visual Studio Code(というかC/C++拡張機能)のIntelliSense微妙だよね?となり、C/C++拡張機能ソースコードが公開されていないなー、使うならVisual Studioだよなー、と脳内が大幅に脱線してしまって、全然、Visual Studio Codeを触っていませんでした。

ですが、先日、ET2017のArmブースで渡會さんがVisual Studio CodeでSTM32をデバッグするデモを展示しており、すぐにセットアップ手順も公開されたので、それに沿って「以前、なにがダメだったのか」を確認しようと思います。

渡會さんが公開しているセットアップ手順はこちら。 VSCodeでSTM32マイコンのデバッグ環境を構築する | Mbed

必要なソフトウェアのインストール

VSCodeのダウンロードとインストール

既にVSCodeはインストールされていました。しかし、x86だったので、x64 1.18.1をインストールしました。

C/C++拡張機能のインストール

C/C++ 0.14.2をインストールしました。

OpenOCDのインストール

既にインストールされていました。

Open On-Chip Debugger 0.10.0+dev-00130-gcb317ea-dirty (2017-04-26-21:33)

Mbed OS用ビルドツールのインストール

Mbed CLIの開発環境が整っているので、たぶん大丈夫でしょう。というわけでスルー。

プロジェクトの設定

適当なフォルダに、サンプルプログラムをインポートします。これはいつもやっている操作ですね。

C:\mbed>mbed import mbed-os-example-blinky

VSCode用にプロジェクトをエクスポートですが、たぶんここは用意したボードに合わせて、コマンドの引数を変更しないといけない気がします。

mbed detectで、ボードの名前を確認します。

C:\mbed\mbed-os-example-blinky>mbed detect

[mbed] Detected NUCLEO_F401RE, port COM11, mounted D:, interface version 0221:
[mbed] Supported toolchains for NUCLEO_F401RE
+---------------+-----------+-----------+-----------+-----------+-----------+-----------+
| Target        | mbed OS 2 | mbed OS 5 |    ARM    |  GCC_ARM  |    IAR    |   ARMC6   |
+---------------+-----------+-----------+-----------+-----------+-----------+-----------+
| NUCLEO_F401RE | Supported | Supported | Supported | Supported | Supported | Supported |
+---------------+-----------+-----------+-----------+-----------+-----------+-----------+
Supported targets: 1
Supported toolchains: 4

NUCLEO_F401REであることが分かったので、それっぽくエクスポートを実行してみます。

C:\mbed\mbed-os-example-blinky>mbed export -m NUCLEO_F401RE -i vscode_gcc_arm
Scan: .

んー、なんか味気ないメッセージ表示で、ちゃんと実行できたか分かりませんが、このまま進めてみましょう。

.vscode/launch.jsonを、下記のとおり4箇所変更します。ボードとインターフェースに何を指定したらいいのか分からなかったので適当に変更しました。

            "debugServerArgs": "-f \"C:\\OpenOCD\\tcl\\board\\stm32f4discovery.cfg\" -f \"C:\\OpenOCD\\tcl\\interface\\stlink-v2-1.cfg\" -c init -c \"reset init\"",
            "serverStarted": "target halted due to debug-request, current mode: Thread",
                "MIDebuggerPath": "C:\\Program Files (x86)\\GNU Tools ARM Embedded\\4.9 2015q3\\bin\\arm-none-eabi-gdb.exe",
                "debugServerPath": "C:\\OpenOCD\\openocd.exe",

ビルドとデバッグ

Visual Studio Codeの"フォルダを開く"で、mbedソースが置いてあるフォルダを開いて、デバッグ>デバッグの開始を実行します。

f:id:matsujirushix:20171124215241p:plain

あれれ、良く分からないエラーが。

めげずに何度もデバッグ>デバッグの開始、をすると、なんとなくOpenOCDの起動のところまで進みました。

f:id:matsujirushix:20171124215713p:plain

OpenOCDの起動でエラーになっている模様。

コマンドプロンプトで実行してみると、cfgファイルの選択が間違っているように見受けられます。

C:\mbed\mbed-os-example-blinky>"C:\OpenOCD\openocd.exe" -f "C:\OpenOCD\tcl\board\stm32f4discovery.cfg" -f "C:\OpenOCD\tcl\interface\stlink-v2-1.cfg"
Open On-Chip Debugger 0.10.0+dev-00130-gcb317ea-dirty (2017-04-26-21:33)
Licensed under GNU GPL v2
For bug reports, read
        http://openocd.org/doc/doxygen/bugs.html
C:\OpenOCD\tcl\board\stm32f4discovery.cfg:4: Error: Can't find interface/stlink-v2.cfg
in procedure 'script'
at file "embedded:startup.tcl", line 60
at file "C:\OpenOCD\tcl\board\stm32f4discovery.cfg", line 4

NUCLEO_F401RE -> NUCLEO_L476RG

NUCLEO-F401REを早々に諦めて、過去実績のあるNUCLEO-L476RGで試すことに。

mbed export -m NUCLEO_L476RG -i vscode_gcc_armして、.vscode/launch.jsonを下記のとおり編集します。

            "debugServerArgs": "-s C:\\OpenOCD\\tcl -f board\\st_nucleo_l476rg.cfg -c init -c \"reset init\"",
            "serverStarted": "target halted due to debug-request, current mode: Thread",
                "MIDebuggerPath": "C:\\Program Files (x86)\\GNU Tools ARM Embedded\\4.9 2015q3\\bin\\arm-none-eabi-gdb.exe",
                "debugServerPath": "C:\\OpenOCD\\openocd.exe",

デバッグの開始で何度かエラーになりましたが、繰り返すことで、無事、デバッガが起動しました!!!

f:id:matsujirushix:20171124222054p:plain

感想

  • mbed OS(STM32)をVisual Studio Codeでデバッグできた。OpenOCDで。
  • デバッグの開始で、エラーになるときがあった。(ビルドに時間がかかるとエラーになるのか!?)
  • 以前はserverStartedを設定していなかったのがダメだった気がする。
  • 使うボードによってOpenOCDの設定をどうしたらいいか分からなかった。
  • IntelliSense、まともに使える。(以前やったときは、イマイチと感じていたが、mbed-cliでimportしたのが良かったのかも?)