PICからmbed(STM32)へ移行を考えていて、なるべく簡単に開発環境を整えたいと思っていました。mbedはオンライン上でビルドできるのですが、オフラインでできたらいいなと思っていて(インストーラー1回の実行で何も考えなくても環境を整えてくれると有難いのですが)、調べたら以下のサイトが見つかりました。Visual Studioでオフラインでmbedをビルドできるというものです。
http://matsujirushi.hatenablog.jp/entry/2018/01/14/153530
http://matsujirushi.hatenablog.jp/entry/2018/01/14/203033
mbedをオフラインでビルドする方法は色々あるみたいですが、色々なソフトを入れないといけなかったりと大変面倒そうでした。しかし、こちらの方法基本的にVisual Studioを入れて、mbedサイトから出力したファイルをインポートするだけで簡単にできます。他にVS以外の開発環境として、eclipseがあるのですが、昔のトラウマがあるのでこれはいいと思いました。
今回、僕の環境はWin10 64bit、Visual studio2017 community (2019でも可)、マイコンはNUCLEO_F303K8を使いました。
上記サイトの手順をまとめると以下のような感じです。
①mbedサイト( https://ide.mbed.com )でアカウントを作って、適当なサンプルプロジェクトを作る。
②サンプルプロジェクトでプログラムのエクスポート(MAKE-GCC-ARMを選択)
③Visual Studioをインストール
④インストールの際に、C++によるLinux開発 にある、Embedded開発とIoT開発 をチェック
(すでにVSをインストール済だったら、メニューからVisual Studio Installerを起動・変更)
⑤ ②のファイルを展開したフォルダをVSで開く。
⑥ CppProperties.json の作成・編集
⑦ Makefileを選択してビルド。できたbinファイルをマイコンへコピー。
ところが、僕の環境では上記手順でビルドの途中でmain.oまではできるものの、リンクがうまくいかずビルドが失敗するようでした。おそらく、mbedサイトで出力されたMakefileの書式が変わったようです。
具体的にはMakefileの以下のリンカー部分でエラーがでました。
@$(LD) $(LD_FLAGS) -T $(filter-out %.o, $^) $(LIBRARY_PATHS) --output $@ @.link_options.txt $(LIBRARIES) $(LD_SYS_LIBS)
これは、main.oとmbedオブジェクトファイル群をリンクしているのですが、mbedオブジェクトファイル群を一旦.link_options.txtというテキストファイルに出力して、これをリンクしているようですが、僕の環境(win10-64, VS2017 or VS2019 community)ではうまくいかないようです。
そこで、以下のように.link_options.txtではなく、直接、変数を指定します。
@$(LD) $(LD_FLAGS) -T $(filter-out %.o, $^) $(LIBRARY_PATHS) --output $@ $(OBJECTS) $(SYS_OBJECTS) $(LIBRARIES) $(LD_SYS_LIBS)
ただし、これでも、mbed/TARGET_NUCLEO_F303K8/TOOLCHAIN_GCC_ARM/PeripheralPins.oがない、と怒られたため、../mbed/TARGET_NUCLEO_F303K8/TOOLCHAIN_GCC_ARM/PeripheralPins.o をリンクするように変更します。これはMakefileの上の方のオブジェクトパスの部分
SYS_OBJECTS += mbed/TARGET_NUCLEO_F303K8/TOOLCHAIN_GCC_ARM/PeripheralPins.o
SYS_OBJECTS += mbed/TARGET_NUCLEO_F303K8/TOOLCHAIN_GCC_ARM/analogin_api.o
SYS_OBJECTS += mbed/TARGET_NUCLEO_F303K8/TOOLCHAIN_GCC_ARM/analogin_device.o
SYS_OBJECTS += mbed/TARGET_NUCLEO_F303K8/TOOLCHAIN_GCC_ARM/analogout_api.o
SYS_OBJECTS += mbed/TARGET_NUCLEO_F303K8/TOOLCHAIN_GCC_ARM/analogout_device.o
を、以下のように変えました(たくさんあるので一括置換で変えました)。
SYS_OBJECTS += ../mbed/TARGET_NUCLEO_F303K8/TOOLCHAIN_GCC_ARM/PeripheralPins.o
SYS_OBJECTS += ../mbed/TARGET_NUCLEO_F303K8/TOOLCHAIN_GCC_ARM/analogin_api.o
SYS_OBJECTS += ../mbed/TARGET_NUCLEO_F303K8/TOOLCHAIN_GCC_ARM/analogin_device.o
SYS_OBJECTS += ../mbed/TARGET_NUCLEO_F303K8/TOOLCHAIN_GCC_ARM/analogout_api.o
SYS_OBJECTS += ../mbed/TARGET_NUCLEO_F303K8/TOOLCHAIN_GCC_ARM/analogout_device.o
一応、上記の変更でうまくビルドできて、マイコンも動きました。もっとうまい方法があるかと思いますが、とりあえずこれでできた、という報告です。