ビルドする
最初のステップは、“binary” クレートをビルドすることです。マイクロコントローラーは
あなたのコンピューターとは異なるアーキテクチャを持っているため、クロスコンパイルする必要があります。Rust の世界ではクロスコンパイルは
rustc や Cargo に追加の --target フラグを渡すだけなので簡単です。複雑なのは、その
フラグの引数、つまりターゲットの 名前 を見つけ出すことです。
F3 のマイクロコントローラーには Cortex-M4F プロセッサーが搭載されています。rustc は Cortex-M アーキテクチャ向けにクロスコンパイルする方法を理解しており、
そのアーキテクチャ内のさまざまなプロセッサーファミリーをカバーする 4 つの異なるターゲットを提供しています:
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コマンドを実行してください:
cargo build --target thumbv7em-none-eabihf
コンソールには次のような出力が表示されるはずです:
$ cargo build --target thumbv7em-none-eabihf
Compiling typenum v1.12.0
Compiling semver-parser v0.7.0
Compiling version_check v0.9.2
Compiling nb v1.0.0
Compiling void v1.0.2
Compiling autocfg v1.0.1
Compiling cortex-m v0.7.1
Compiling proc-macro2 v1.0.24
Compiling vcell v0.1.3
Compiling unicode-xid v0.2.1
Compiling stable_deref_trait v1.2.0
Compiling syn v1.0.60
Compiling bitfield v0.13.2
Compiling cortex-m v0.6.7
Compiling cortex-m-rt v0.6.13
Compiling r0 v0.2.2
Compiling stm32-usbd v0.5.1
Compiling stm32f3 v0.12.1
Compiling usb-device v0.2.7
Compiling cfg-if v1.0.0
Compiling paste v1.0.4
Compiling stm32f3-discovery v0.6.0
Compiling embedded-dma v0.1.2
Compiling volatile-register v0.2.0
Compiling nb v0.1.3
Compiling embedded-hal v0.2.4
Compiling semver v0.9.0
Compiling generic-array v0.14.4
Compiling switch-hal v0.3.2
Compiling num-traits v0.2.14
Compiling num-integer v0.1.44
Compiling rustc_version v0.2.3
Compiling bare-metal v0.2.5
Compiling cast v0.2.3
Compiling quote v1.0.9
Compiling generic-array v0.13.2
Compiling generic-array v0.12.3
Compiling generic-array v0.11.1
Compiling panic-itm v0.4.2
Compiling lsm303dlhc v0.2.0
Compiling as-slice v0.1.4
Compiling micromath v1.1.0
Compiling accelerometer v0.12.0
Compiling chrono v0.4.19
Compiling aligned v0.3.4
Compiling rtcc v0.2.0
Compiling cortex-m-rt-macros v0.1.8
Compiling stm32f3xx-hal v0.6.1
Compiling aux5 v0.2.0 (~/embedded-discovery/src/05-led-roulette/auxiliary)
Compiling led-roulette v0.2.0 (~/embedded-discovery/src/05-led-roulette)
Finished dev [unoptimized + debuginfo] target(s) in 17.91s
注記 このクレートは必ず最適化を 行わずに コンパイルしてください。付属の Cargo.toml ファイルと上記のビルドコマンドにより、最適化が無効になるようになっています。
よし、これで実行可能ファイルが生成されました。この実行可能ファイルはまだどの LED も点滅させません。これは、この章の後半で土台として使う簡略化されたバージョンにすぎません。念のため、生成された実行可能ファイルが実際に ARM バイナリであることを確認しましょう:
cargo readobj --target thumbv7em-none-eabihf --bin led-roulette -- --file-header
上の cargo readobj .. は
readelf -h target/thumbv7em-none-eabihf/debug/led-roulette
と等価であり、次のような出力になるはずです:
$ cargo readobj --target thumbv7em-none-eabihf --bin led-roulette -- --file-header
Finished dev [unoptimized + debuginfo] target(s) in 0.02s
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: 0
Type: EXEC (Executable file)
Machine: ARM
Version: 0x1
Entry point address: 0x8000195
Start of program headers: 52 (bytes into file)
Start of section headers: 818328 (bytes into file)
Flags: 0x5000400
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 4
Size of section headers: 40 (bytes)
Number of section headers: 22
Section header string table index: 20
次に、このプログラムをマイクロコントローラーにフラッシュ書き込みします。