ビルドする

最初のステップは「バイナリ」クレートをビルドすることです。 マイクロコントローラはあなたのコンピュータとはアーキテクチャが異なるため、クロスコンパイルが必要です。 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

次にこのプログラムをマイクロコントローラのフラッシュに書き込みます。