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

Debugging mbed OS applications with Visual Studio Codeをやってみた備忘録です。 github.com

基本的には、この手順通りですが、(現在は)いくつかハマりポイントがあったので、書いておきます。

環境は、

です。

Nucleo-L476RGをデバッグしたかったのですがpyOCDが対応していない、mbed LPC1768はGCC (ARM Embedded)向けのエクスポートが無い、ことから、FRDM-K64Fを使いました。Nucleoやmbed LPC1768については、機会があれば書きたいと思います。

Wataraiさんの、STM32+OpenOCD記事。

VSCodeでSTM32マイコンのデバッグ環境を構築する

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

Toolchain

C/C++コンパイラ

GNU ARM Embedded Toolchainをインストールします。

わたしの環境は、既に4.9 2015q3をインストールしていたので、特に何もしませんでした。

4.9-2015-q3-update : Series 4.9 : GNU ARM Embedded Toolchain

インストール先はC:\Program Files (x86)\GNU Tools ARM Embedded\4.9 2015q3で、環境変数PATHにC:\Program Files (x86)\GNU Tools ARM Embedded\4.9 2015q3\binを追加しています。 f:id:matsujirushix:20170430144048p:plain

makeコマンド

mbedからMakefileが提供されていますが、GNU ARM Embedded Toolchainにmakeコマンドが含まれていないので、追加でインストールします。

GnuWin32に含まれている下記ファイルを、C:\Program Files (x86)\GNU Tools ARM Embedded\4.9 2015q3\binにコピーします。

sourceforge.net

コピーするファイル名 含まれているzipファイル名
make.exe make-3.81-bin.zip
libiconv2.dll make-3.81-dep.zip
libintl3.dll make-3.81-dep.zip

Debug toolchain

OCD(On-Chip Debugger)

ボードに合わせて、pyOCDもしくはOpenOCDをインストールします。(OpenOCDは、ビルド作業が必要だったり、設定ファイルを書かなければいけないようです。)

今回のFRDM-K64FはpyOCDが対応していますので、pyOCDをインストールします。

pyOCD

pyOCDは、Python 2.7系をインストールしてから、pipコマンドでインストールします。

www.python.org

> C:\Python27\Scripts\pip install pyocd

f:id:matsujirushix:20170430172233p:plain

Visual Studio Code

Visual Studio Codeをインストールします。

code.visualstudio.com

なお、PATHへの追加は不要なので、チェックを外しました。

f:id:matsujirushix:20170430173501p:plain

次に、拡張機能C/C++をインストールします。

f:id:matsujirushix:20170430173515p:plain

ソフトウェアの確認

mbed OSプログラム

動かしてみるプログラムを用意します。

mbedオンラインコンパイラでmbed OS Blinky LED HelloWorldを作成して、GCC (ARM Embedded)向けにエクスポート、適当なフォルダに解凍します。

f:id:matsujirushix:20170430145933p:plain f:id:matsujirushix:20170430150104p:plain f:id:matsujirushix:20170430151656p:plain

Toolchain

mbed OSプログラムのフォルダでmakeコマンドを実行して、コンパイルできるか確認します。

> make
C:/Users/takashi/Desktop/mbed-os-example-blinky/makefile:615: warning: overriding commands for target `.s.o'
C:/Users/takashi/Desktop/mbed-os-example-blinky/makefile:610: warning: ignoring old commands for target `.s.o'
"Compile: main.cpp"
"Compile: AnalogIn.cpp"
...
"Compile: rtc_api.c"
"Compile: sleep.c"
../mbed-os/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/api/sleep.c: In function 'hal_deepsleep':
../mbed-os/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/api/sleep.c:31:16: warning: unused variable 'mode' [-Wunused-variable]
     mcg_mode_t mode = CLOCK_GetMode();
                ^
"link: mbed-os-example-blinky.elf"
'arm-none-eabi-objcopy' -O binary mbed-os-example-blinky.elf mbed-os-example-blinky.bin
"===== bin file ready to flash: BUILD/mbed-os-example-blinky.bin ====="
'arm-none-eabi-objcopy' -O ihex mbed-os-example-blinky.elf mbed-os-example-blinky.hex

>

mbed-os-example-blinky.elfが出来上がっていればOKです。

pyOCD

FRDM-K64FをUSB接続しておき、pyocd-gdbserverを起動してGDB serverがスタートするか確認します。

> c:\Python27\Scripts\pyocd-gdbserver.exe
INFO:root:DAP SWD MODE initialised
INFO:root:K64F not in secure state
INFO:root:ROM table #0 @ 0xe00ff000 cidr=b105100d pidr=4000bb4c4
INFO:root:[0]<e000e000:SCS-M4 cidr=b105e00d, pidr=4000bb00c, class=14>
WARNING:root:Invalid coresight component, cidr=0x0
INFO:root:[1]<e0001000: cidr=0, pidr=0, component invalid>
INFO:root:[2]<e0002000:FPB cidr=b105e00d, pidr=4002bb003, class=14>
WARNING:root:Invalid coresight component, cidr=0xb1b1b1b1
INFO:root:[3]<e0000000: cidr=b1b1b1b1, pidr=b1b1b1b1b1b1b1b1, component invalid>
WARNING:root:Invalid coresight component, cidr=0x0
INFO:root:[4]<e0040000: cidr=0, pidr=0, component invalid>
INFO:root:[5]<e0041000:ETM-M4 cidr=b105900d, pidr=4000bb925, class=9, devtype=13, devid=0>
INFO:root:[6]<e0042000:ETB cidr=b105900d, pidr=4003bb907, class=9, devtype=21, devid=0>
INFO:root:[7]<e0043000:CSTF cidr=b105900d, pidr=4001bb908, class=9, devtype=12, devid=28>
INFO:root:CPU core is Cortex-M4
INFO:root:FPU present
INFO:root:6 hardware breakpoints, 4 literal comparators
INFO:root:4 hardware watchpoints
INFO:root:Telnet: server started on port 4444
INFO:root:GDB server started at port:3333

"GDB server started"と表示されていればOKです。

pyOCDはVisual Studio Codeから都度起動されるので、Ctrl+Cで止めておいてください。

Visual Studio Codeでmbed OSプログラムをデバッグ

Makefileの修正

mbedで作成されたMakefileは、オプションが最適化ありになっているので、デバッグできるよう最適化を無効にします。

■変更前

CPP = 'arm-none-eabi-g++' '-std=gnu++98' '-fno-rtti' '-Wvla' '-c' '-Wall' '-Wextra' '-Wno-unused-parameter' '-Wno-missing-field-initializers' '-fmessage-length=0' '-fno-exceptions' '-fno-builtin' '-ffunction-sections' '-fdata-sections' '-funsigned-char' '-MMD' '-fno-delete-null-pointer-checks' '-fomit-frame-pointer' '-Os' '-mcpu=cortex-m4' '-mthumb' '-mfpu=fpv4-sp-d16' '-mfloat-abi=softfp'

■変更後

CPP = 'arm-none-eabi-g++' '-std=gnu++98' '-fno-rtti' '-Wvla' '-c' '-Wall' '-Wextra' '-Wno-unused-parameter' '-Wno-missing-field-initializers' '-fmessage-length=0' '-fno-exceptions' '-fno-builtin' '-ffunction-sections' '-fdata-sections' '-funsigned-char' '-MMD' '-fno-delete-null-pointer-checks' '-fomit-frame-pointer' '-O0' '-ggdb' '-mcpu=cortex-m4' '-mthumb' '-mfpu=fpv4-sp-d16' '-mfloat-abi=softfp'

オプション変更は十分吟味されていません。お気づきの点があればコメントください。

Makefileを修正したので、再度、全てをビルドし直す必要があります。BUILDフォルダを削除しておきましょう。

Visual Studio Codeの構成を設定

mbed OSプログラムのフォルダに、vscode.zipを展開します。

Visual Studio Codeの構成は、.vscode/settings.json, .vscode/tasks.json, .vscode/launch.json ファイル。

1drv.ms

mbed handbookには、Visual Studio Code向けにエクスポートすると、構成が正しく設定されているっぽいのですが、現在はVisual Studio Code向けの選択肢が表示されませんでした。

ググったところ、github(参考)に構成ファイルがありましたので、これを修正してvscode.zipを作りました。

デバッグの開始

Visual Studio Codeで、デバッグの開始を実行します。

f:id:matsujirushix:20170430182048p:plain

プログラムに問題なくても、わりと高い確率でmakeがエラーになります。焦らず、何度もデバッグの開始を実行しましょう。(汗

気分良くビルドしたい場合は、コマンドプロンプトからmakeを実行してください。

最後に

Visual Studio Codeにインクルードパスを指定していないため、せっかくVisual Studio Codeを使っているのにIntelliSenseがきちんと動作していない。Visual Studio Codeに何か設定が必要なのだろう。

mbed handbookに手順書があったのでVisual Studio Codeを使ったが、Mac/Linux使っておらず、普段はVisual Studio Proを使っているので、Visual Studioでコレをできるようにしたい。

参考

qiita.com

github.com