Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

ビルドしてみましょう

最初のステップは、“binary” クレートをビルドすることです。マイクロコントローラーはあなたのコンピューターとは異なる アーキテクチャを持っているため、クロスコンパイルする必要があります。Rust の世界では、クロスコンパイルは rustc または Cargo に追加の --target フラグを渡すだけで簡単に行えます。複雑なのは、その フラグに渡す引数、つまりターゲットの名前を見つけることです。

すでに知っているように、micro:bit v2 のマイクロコントローラーには Cortex-M4F プロセッサーが搭載されており、v1 には Cortex-M0 が搭載されています。 rustc は 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:bit v2 では thumbv7em-none-eabihf ターゲットを使い、v1 では thumbv6m-none-eabi を使います。 クロスコンパイルする前に、ターゲット向けの標準ライブラリのプリコンパイル済みバージョン (実際にはその縮小版)をダウンロードする必要があります。これは rustup を使って行います。

# micro:bit v2 の場合
$ rustup target add thumbv7em-none-eabihf
# micro:bit v1 の場合
$ rustup target add thumbv6m-none-eabi

上記の手順は一度だけ実行すれば十分です。rustup はツールチェーンを更新するたびに、新しい標準ライブラリ (rust-std コンポーネント)を再インストールします。したがって、verifying your setup の際に必要なターゲットをすでに追加している場合は、 この手順をスキップできます。

rust-std コンポーネントが用意できたので、今度は Cargo を使ってプログラムをクロスコンパイルできます。

# `src/05-led-roulette` ディレクトリにいることを確認してください

# 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

# 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 ファイルとビルドコマンドにより、最適化が無効になることが保証されます。

OK、これで実行可能ファイルが生成されました。この実行可能ファイルはまだどの LED も点滅させません。 これは、この章の後半で土台として使う簡略化されたバージョンにすぎません。 念のため、生成された実行可能ファイルが本当に ARM バイナリであることを確認してみましょう。

# micro:bit v2 の場合
# `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

# micro:bit v1 の場合
# `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

次に、プログラムをマイクロコントローラーに書き込みます。