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
ここで、ハマりどころがあります。
- Rustがサポートするターゲットシステムの一覧がわからない
- ターゲットシステムがサポートされていない
これらの詳細は、コンパイラサポートに記載しますが、解決方法を簡単にだけ示します。まず、ターゲットシステム一覧は、次のコマンドで取得できます。
$ 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-objdump
やllvm-size
などをCargoから呼び出すことができます。
ターゲットアーキテクチャ用のGNU binutilsがインストールされており、そのコマンドに慣れている場合、無理に使う必要はありません。しかし、Rustでバイナリハックする上で、ターゲットアーキテクチャに依存せず、同じコマンドで利用できる、というのは大きなメリットです。
2-5. QEMU
QEMUは、有名なエミュレータです。実際のハードウェアで開発を行う前に、実験を行う場合に重宝します。本書内でも動作確認目的で、何度か利用します。