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 フラグを渡すだけなので簡単です。複雑なのは、その フラグの引数、つまりターゲットの 名前 を見つけ出すことです。

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

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