ビルド
最初の一歩は、「バイナリ」クレートをビルドすることです。マイクロコントローラは、あなたのノートPCとアーキテクチャが異なるため、クロスコンパイルする必要が有ります。
Rustでのクロスコンパイルは、rustc
かCargoに追加の--target
フラグを渡すだけです。
複雑な部分は、フラグの引数、つまりターゲットの名前を見つけ出すことです。
F3のマイクロコントローラは、Cortex-M4Fプロセッサを搭載しています。
rustc
は、Cortex-Mアーキテクチャ向けにクロスコンパイルする方法を知っており、4つの異なるターゲットを提供しています。
これらのターゲットは、Cortex-Mアーキテクチャの異なるプロセッサファミリを対象としています。
thumbv6m-none-eabi
, Cortex-M0とCortex-M1プロセッサ向けthumbv7m-none-eabi
, Cortex-M3プロセッサ向けthumbv7em-none-eabi
, Cortex-M4とCortex-M7プロセッサ向けthumbv7em-none-eabihf
, Cortex-M4FとCortex-M7Fプロセッサ向け
F3に対しては、thumbv7em-none-eabihf
ターゲットを使います。
クロスコンパイルする前に、あらかじめターゲット向けにコンパイルされた標準ライブラリ(実際にはその縮小版)をダウンロードしなければなりません。
rustup
を使ってダウンロードできます。
$ rustup target add thumbv7em-none-eabihf
上記のコマンドは一度だけ実行する必要が有ります。rustup
は、ツールチェインをアップデートするときに、
新しい標準ライブラリ(rust-std
コンポーネント)を再インストールしてくれます。
rust-std
コンポーネントがあれば、Cargoを使ってプログラムをクロスコンパイルできます。
$ # `src/05-led-roulette`ディレクトリにいることを確認して下さい
$ cargo build --target thumbv7em-none-eabihf
Compiling semver-parser v0.7.0
Compiling aligned v0.1.1
Compiling libc v0.2.35
Compiling bare-metal v0.1.1
Compiling cast v0.2.2
Compiling cortex-m v0.4.3
(..)
Compiling stm32f30x v0.6.0
Compiling stm32f30x-hal v0.1.2
Compiling aux5 v0.1.0 (file://$PWD/aux)
Compiling led-roulette v0.1.0 (file://$PWD)
Finished dev [unoptimized + debuginfo] target(s) in 35.84 secs
注記 このクレートを必ず最適化なしでコンパイルして下さい。提供しているCargo.tomlと上記のビルドコマンドは、最適化をオフにしています。
OK、これで実行ファイルが作成されました。この実行ファイルは、LEDを点滅させません。これは、この章の後半でビルドする単純なものです。 正当性検査のため、作成した実行ファイルが本当にARMのバイナリかどうか確認してみましょう。
$ # `readelf -h target/thumbv7em-none-eabihf/debug/led-roulette`と同じです
$ cargo readobj --target thumbv7em-none-eabihf --bin led-roulette -- -file-headers
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0x0
Type: EXEC (Executable file)
Machine: ARM
Version: 0x1
Entry point address: 0x8000197
Start of program headers: 52 (bytes into file)
Start of section headers: 740788 (bytes into file)
Flags: 0x5000400
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 2
Size of section headers: 40 (bytes)
Number of section headers: 20
Section header string table index: 18
次は、このプログラムをマイクロコントローラのFlashに書き込みます。