2. 環境構築

組込み開発では、ホストPCとは異なるアーキテクチャのバイナリを生成しなければならないため、いくつかのツールが必要になります。また、バイナリを解析したり、逆アセンブリを行ってデバッグを行う際に、便利なツールも用意しておくと良いでしょう。

ターゲットにできるアーキテクチャは多岐に渡りますし、読者が開発を行う環境もLinux / Mac / Windowsとバリエーションが多いです。これを本書で網羅することはできないため、(1) 用意するもの、(2) インストール手順を記載したWebサイトへのリンク、(3) その他備考、のみを示します。

まず、用意するもののリストは、次の通りです。

  • Rust (クロスコンパイルツールチェイン含む)
  • GDB
  • デバッグフレームワーク (OpenOCD, JLinkなど)
  • cargo-binutils
  • QEMU

Cortex-Mをターゲットとするこれらのインストール手順は、The Embedded Rust Bookのインストールに記載されています。

2-1. Rust

Rustはクロスコンパイルが簡単な言語ですが、デフォルトのインストールでは、ホストマシンのネイティブコンパイルのみをサポートしています。そのため、ターゲットとするクロスコンパイラを追加するために、rustupでターゲットを追加します。例えば、ARMのCortex-M0であれば、次の通りです。

$ rustup target add thumbv6m-none-eabi 

ここで、ハマりどころがあります。

  1. Rustがサポートするターゲットシステムの一覧がわからない
  2. ターゲットシステムがサポートされていない

これらの詳細は、コンパイラサポートに記載しますが、解決方法を簡単にだけ示します。まず、ターゲットシステム一覧は、次のコマンドで取得できます。

$ rustc --print target-list

次に、ターゲットシステムがサポートされていない場合ですが、ターゲットのspecificationをJSON形式のファイルで用意します。

2-2. GDB

読者の中には、LLDBに慣れ親しんだ方も居るかと思います。通常のデバッグに関して、LLDBはGDBと同水準の機能があります。しかし、ターゲットハードウェアにプログラムをアップロードするGDBのloadコマンド相当のものが、LLDBにはありません。そのため、マイクロコントローラのファームウェア開発に限っては、GDBの利用をおすすめします。

2-3. デバッグフレームワーク

マイクロコントローラ上で動作するプログラムをGDBでデバッグするためには、SWD (Serial Wire Debug) やJTAGプロトコルを使って、GDBサーバーのサービスを提供するソフトウェアが必要になります。

このようなソフトウェアで、主要なものとしては、OpenOCDとJLinkがあります。どちらも、Rustで作成したプログラムをデバッグすることが可能です。 ターゲットとするマイクロコントローラの開発で使いやすい方を選択して下さい。Discovery環境構築では、OpenOCDの環境構築方法が記載されています。

2-4. cargo-binutils

cargo-binutilsは、LLVM binary utilitiesを簡単に利用するためのCargoサブコマンドです。llvm-objdumpllvm-sizeなどをCargoから呼び出すことができます。

ターゲットアーキテクチャ用のGNU binutilsがインストールされており、そのコマンドに慣れている場合、無理に使う必要はありません。しかし、Rustでバイナリハックする上で、ターゲットアーキテクチャに依存せず、同じコマンドで利用できる、というのは大きなメリットです。

2-5. QEMU

QEMUは、有名なエミュレータです。実際のハードウェアで開発を行う前に、実験を行う場合に重宝します。本書内でも動作確認目的で、何度か利用します。