ビルドする
最初のステップは「バイナリ」クレートをビルドすることです。
マイクロコントローラはあなたのコンピュータとはアーキテクチャが異なるため、クロスコンパイルが必要です。
Rustでのクロスコンパイルは単に--target
フラグをrustc
またはCargoに渡すだけです。
難しいところはフラグの引数として渡すターゲット名に目星をつけることです。
micro:bit v2上のマイクロコントローラはCortex-M4Fプロセッサを、v1はCortex-M0プロセッサを搭載していることがわかっています。
rustc
はCortex-Mアーキテクチャへのクロスコンパイル方法を知っています。
いくつかの異なるターゲットを提供しており、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プロセッサ向けthumbv8m.main-none-eabi
, Cortex-M33プロセッサとCortex-M35Pプロセッサ向けthumbv8m.main-none-eabihf
, Cortex-M33FプロセッサとCortex-M35PFプロセッサ向け
micro:bit2にはthumbv7em-none-eabihf
ターゲットを、v1にはthumbv6m-none-eabi
を使います。
クロスコンパイルをする前に、ターゲット向けに事前コンパイルされた標準ライブラリをダウンロードします(実際は縮小版ですが)。
これはrustup
を使ってやります。
# For micro:bit v2
$ rustup target add thumbv7em-none-eabihf
# For micro:bit v1
$ rustup target add thumbv6m-none-eabi
このステップは一度だければ良いです。ツールチェインをアップデートすると、rustup
は新しい標準ライブラリ(rust-std
)を再インストールします。
そのため、セットアップの検証で既にターゲットを追加していれば、このステップを省略できます。
rust-std
をインストールするとCargoを使ってプログラムをクロスコンパイルすることができます。
# make sure you are in the `src/05-led-roulette` directory
# For micro:bit v2
$ cargo build --features v2 --target thumbv7em-none-eabihf
Compiling semver-parser v0.7.0
Compiling typenum v1.12.0
Compiling cortex-m v0.6.3
(...)
Compiling microbit-v2 v0.10.1
Finished dev [unoptimized + debuginfo] target(s) in 33.67s
# For micro:bit v1
$ cargo build --features v1 --target thumbv6m-none-eabi
Compiling fixed v1.2.0
Compiling syn v1.0.39
Compiling cortex-m v0.6.3
(...)
Compiling microbit v0.10.1
Finished dev [unoptimized + debuginfo] target(s) in 22.73s
注意 このクレートは必ず最適化なしでコンパイルしてください。 提供しているCargo.tomlファイルとビルドコマンドは、最適化がオフになっていることを確認してください。
これで、実行ファイルが作成できました。 この実行ファイルはLEDを点滅しません。この章で後で作る物を単純化したものです。 動作確認として、作成した実行ファイルが本当にARMのバイナリかどうか確かめてみましょう。
# For micro:bit v2
# equivalent to `readelf -h target/thumbv7em-none-eabihf/debug/led-roulette`
$ cargo readobj --features v2 --target thumbv7em-none-eabihf --bin led-roulette -- --file-headers
Finished dev [unoptimized + debuginfo] target(s) in 0.01s
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: 0x117
Start of program headers: 52 (bytes into file)
Start of section headers: 793112 (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: 21
Section header string table index: 19
# For micro:bit v1
# equivalent to `readelf -h target/thumbv6m-none-eabi/debug/led-roulette`
$ cargo readobj --features v1 --target thumbv6m-none-eabi --bin led-roulette -- --file-headers
Finished dev [unoptimized + debuginfo] target(s) in 0.01s
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: 0xC1
Start of program headers: 52 (bytes into file)
Start of section headers: 693196 (bytes into file)
Flags: 0x5000200
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
次にこのプログラムをマイクロコントローラのフラッシュに書き込みます。