SNSへはこちら

RustでARM Cortex-Mの組み込みプログラミング環境が進化していた話

Xargo を用いてビルドを行ってきましたが、どうやらそれは必要ではなくなり、Cargo 単独でできるようになっていたらしいです。参考サイトは以下。

2018年4月、Rustでの組み込みプログラミング環境に2つの大きなニュースが舞い込んできた。 Xargo と arm-none-eabi-lld 無しでCortex-M向けのビルドが可能に PSA: You no longer need Xargo to do ARM Cortex-M development#rus...

ARM Cortex-M 用トリプルが追加された

stable 版も nightly 版もどちらも対応しているようです。まずは最新版にアップデートしましょう。.cargo/config の設定項目の都合上、nightly 版で試します。

$ rustup update # rustc をアプデ
$ rustup default nightly # nightly に切り替える
$ rustup target list | grep thumb # 対応リストを見てみる
thumbv6m-none-eabi
thumbv7em-none-eabi
thumbv7em-none-eabihf
thumbv7m-none-eabi

なるほど、確かにトリプルがありますね。では今回は STM32F303 を使いたいので、thumbv7em-none-eabihf を入れることにします。

$ rustup target add thumbv7em-none-eabihf

さて、今回は出来合いの自前マイコンプロジェクトで実験してみることにします。

Bare Metal Programming for STM32 on Rust. Contribute to shima-529/STM32OnRust development by creating an account on GitHub.

クローンして、中の Makefile で xargo となっている部分を cargo にします。
そしてビルドしましょう!

$ make
cargo build
   Compiling stm32OnRust v0.1.0 (/Users/yuki/STM32OnRust)
   Compiling r0 v0.2.2
    Finished dev [unoptimized + debuginfo] target(s) in 4.43s

いとも簡単に終わってしまいました。噂は本当だったんですね。

lld に対応

よくわからないのですが、クロスコンパイル環境としてアツい llvm の速いリンカ、lld にも対応したとのこと。Mac で Homebrew な人はまず入れましょう。サイズが 1GB 超えます。

$ brew install llvm

そしてインストールディレクトリを PATH に含ませます。バージョンの文字列は入れた時期によって異なると思いますので、自分で調べてください。

$ export PATH="/usr/local/Cellar/llvm/7.0.0/bin/:${PATH}"
$ lld --version # 実行できるか確認
lld is a generic driver.
Invoke ld.lld (Unix), ld64.lld (macOS), lld-link (Windows), wasm-lld (WebAssembly) instead

そしたら .cargo/config の中身をこんな感じに変えちゃえばいいです。だいぶ簡単になりましたね。

[target.thumbv7em-none-eabihf]
runner = 'arm-none-eabi-gdb'
rustflags = [
    "-C", "linker=lld",
    "-Z", "linker-flavor=ld.lld",
    "-C", "link-arg=-Tsrc/layout.ld",
]

[build]
target = "thumbv7em-none-eabihf"

あとはまたしてもビルドするだけです。少し速くなりました。

$ make
cargo build
   Compiling stm32OnRust v0.1.0 (/Users/yuki/STM32OnRust)
   Compiling r0 v0.2.2
    Finished dev [unoptimized + debuginfo] target(s) in 3.91s