ビルド

最初の一歩は、「バイナリ」クレートをビルドすることです。マイクロコントローラは、あなたのノート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に書き込みます。