ツール
マイクロコントローラーを扱うには、いくつかの異なるツールを使用する必要があります。これは、 ラップトップとは異なるアーキテクチャを扱うことになり、さらに リモート デバイス上で プログラムを実行し、デバッグしなければならないためです。
以下に挙げるツールをすべて使用します。最小バージョンが指定されていない場合は、 最近のバージョンであればどれでも動作するはずですが、ここではテスト済みの バージョンを記載しています。
- Rust 1.31、1.31-beta、またはそれ以降のツールチェーンに加え、ARM Cortex-M のコンパイル サポート
cargo-binutils~0.1.4qemu-system-arm。テスト済みバージョン: 3.0.0- OpenOCD >=0.8。テスト済みバージョン: v0.9.0 および v0.10.0
- ARM サポート付き GDB。バージョン 7.12 以降を強く推奨。テスト済み バージョン: 7.10、7.11、7.12、8.1
cargo-generateまたはgit。 これらのツールは任意ですが、本書を読み進めるのが容易になります。
以下の本文では、これらのツールを使用する理由を説明します。インストール手順は 次のページにあります。
cargo-generate または git
ベアメタルプログラムは、プログラムのメモリレイアウトを正しくするために、
リンク処理にいくつかの調整を必要とする非標準の (no_std) Rust プログラムです。
そのため、追加のファイル(リンカスクリプトなど)や
設定(リンカフラグなど)が必要になります。私たちはそれらをテンプレートとして
パッケージ化しているため、足りない情報(プロジェクト名や
対象ハードウェアの特性など)を埋めるだけで済みます。
このテンプレートは cargo-generate と互換性があります。これは、テンプレートから
新しい Cargo プロジェクトを作成するための Cargo サブコマンドです。git、curl、
wget、または Web ブラウザを使用してテンプレートをダウンロードすることもできます。
cargo-binutils
cargo-binutils は、Rust ツールチェーンに同梱されている LLVM ツールを簡単に使えるようにする
Cargo サブコマンドのコレクションです。これらのツールには、LLVM 版の
objdump、nm、size が含まれており、バイナリの調査に使用されます。
GNU binutils ではなくこれらのツールを使う利点は、(a) LLVM ツールのインストールが、
OS に関係なく同じ 1 コマンド(rustup component add llvm-tools)で行えること、そして (b) objdump のようなツールが、
ARM から x86_64 まで、rustc がサポートするすべてのアーキテクチャをサポートしていることです。これは
両者が同じ LLVM バックエンドを共有しているためです。
qemu-system-arm
QEMU はエミュレーターです。この場合は、ARM システムを完全にエミュレートできるバリアントを使用します。QEMU を使って、ホスト上で 組み込みプログラムを実行します。これにより、手元にハードウェアがまったくなくても、 本書の一部を進めることができます。
Embedded Rust デバッグのためのツール
概要
Rust における組み込みシステムのデバッグには、デバッグプロセスを管理するソフトウェア、プログラムの実行を調査および制御するためのデバッガー、そしてホストと組み込みデバイスとの相互作用を可能にするハードウェアプローブなど、専用のツールが必要です。この文書では、Probe-rs や OpenOCD のような、デバッグプロセスを簡素化して支援する重要なソフトウェアツールと、GDB や Probe-rs Visual Studio Code 拡張機能のような代表的なデバッガーについて説明します。さらに、組み込みデバイスの効果的なデバッグとプログラミングに不可欠な、Rusty-probe、ST-Link、J-Link、MCU-Link などの主要なハードウェアプローブについても扱います。
デバッグツールを駆動するソフトウェア
Probe-rs
Probe-rs は、組み込みシステムにおいてデバッガーと連携するよう設計された、Rust を重視したモダンなソフトウェアです。OpenOCD とは異なり、Probe-rs はシンプルさを念頭に構築されており、他のデバッグソリューションでしばしば見られる設定負荷を軽減することを目指しています。さまざまなプローブとターゲットをサポートし、組み込みハードウェアとやり取りするための高水準インターフェースを提供します。Probe-rs は Rust のツール群と直接統合されており、さらにその拡張機能を通じて Visual Studio Code とも統合されるため、開発者はデバッグワークフローを効率化できます。
OpenOCD (Open On-Chip Debugger)
OpenOCD は、組み込みシステムのデバッグ、テスト、プログラミングに使用されるオープンソースのソフトウェアツールです。ホストシステムと組み込みハードウェアの間のインターフェースを提供し、JTAG や SWD (Serial Wire Debug) のようなさまざまなトランスポート層をサポートします。OpenOCD はデバッガーである GDB と統合されます。OpenOCD は広くサポートされており、豊富なドキュメントと大規模なコミュニティがありますが、特にカスタムの組み込み構成では複雑な設定が必要になる場合があります。
デバッガー
デバッガーを使用すると、開発者はエラーやバグを特定して修正するために、プログラムの実行を調査および制御できます。デバッガーは、ブレークポイントの設定、コードを 1 行ずつ実行するステップ実行、変数の値やメモリ状態の確認といった機能を提供します。デバッガーは、徹底したソフトウェア開発と保守に不可欠であり、さまざまな条件下でコードが意図どおりに動作することを開発者が確認できるようにします。
デバッガーは次のことを行う方法を認識しています:
- メモリマップトレジスタを操作する。
- ブレークポイント / ウォッチポイントを設定する。
- メモリマップトレジスタの読み取りと書き込みを行う。
- デバッグイベントによって MCU が停止したことを検出する。
- デバッグイベントの発生後に MCU の実行を再開する。
- マイクロコントローラーの FLASH を消去して書き込む。
Probe-rs Visual Studio Code 拡張機能
Probe-rs には Visual Studio Code 拡張機能があり、大がかりなセットアップなしでシームレスなデバッグ体験を提供します。この連携により、開発者は pretty printing や詳細なエラーメッセージといった Rust 固有の機能を利用でき、デバッグプロセスを Rust エコシステムに沿ったものにできます。
TRACE32
TRACE32 は、Lauterbach によって開発された、組み込みシステム向けのプロフェッショナルなデバッグおよびトレースソリューションです。ARM や RISC-V を含む幅広いプロセッサアーキテクチャをサポートし、JTAG、SWD、および各種トレースインターフェースを介してターゲットハードウェアに接続します。TRACE32 は、マルチコアデバッグ、複雑なブレークポイント、リアルタイムのトレース解析などの高度なデバッグ機能を提供します。標準的な ELF/DWARF デバッグ情報を利用するため、従来のツールチェーンでビルドされた Rust バイナリと互換性があります。
GDB (GNU Debugger)
GDB は、プログラムの実行中またはクラッシュ後にその状態を調べることができる、汎用的なデバッグツールです。Embedded Rust では、GDB は OpenOCD やその他のデバッグサーバーを介してターゲットシステムに接続し、組み込みコードと対話します。GDB は高度に構成可能で、リモートデバッグ、変数の調査、条件付きブレークポイントなどの機能をサポートします。さまざまなプラットフォームで使用でき、pretty printing や IDE との統合など、Rust 固有のデバッグ要件も幅広くサポートしています。
プローブ
ハードウェアプローブは、ホストコンピューターとターゲットの組み込みデバイスの間の通信を可能にするために、組み込みシステムの開発およびデバッグで使用されるデバイスです。通常は JTAG や SWD のようなプロトコルをサポートしており、組み込みシステム上のマイクロコントローラーやマイクロプロセッサーのプログラミング、デバッグ、解析を可能にします。ハードウェアプローブは、ブレークポイントの設定、コードのステップ実行、メモリやプロセッサレジスタの確認を開発者が行ううえで重要であり、問題をリアルタイムで診断して修正できるようにします。
Rusty-probe
Rusty-probe は、probe-rs と連携するように設計された、オープンソースの USB ベースのハードウェアデバッグプローブです。Rusty-Probe と probe-rs を組み合わせることで、組み込み Rust アプリケーションを扱う開発者にとって、使いやすく費用対効果の高いソリューションが提供されます。
ST-Link
ST-Link は、STMicroelectronics が主に STM32 および STM8 マイクロコントローラーシリーズ向けに開発した、広く利用されているデバッグおよびプログラミングプローブです。JTAG または SWD(Serial Wire Debug)インターフェイスを介したデバッグとプログラミングの両方をサポートしています。STMicroelectronics の幅広い開発ボード製品群から直接サポートされ、主要な IDE に統合されていることから、ST-Link は広く利用されており、STM マイクロコントローラーを扱う開発者にとって便利な選択肢となっています。
J-Link
SEGGER Microcontroller が開発した J-Link は、ARM に限らず RISC-V などを含む幅広い CPU コアおよびデバイスをサポートする、堅牢で汎用性の高いデバッガです。高い性能と信頼性で知られる J-Link は、JTAG、SWD、fine-pitch JTAG インターフェイスなど、さまざまな通信インターフェイスをサポートしています。フラッシュメモリ上での無制限のブレークポイントなどの高度な機能や、多数の開発環境との互換性が評価され、広く支持されています。
MCU-Link
MCU-Link は、NXP Semiconductors が提供する、プログラマとしても機能するデバッグプローブです。さまざまな ARM Cortex マイクロコントローラーをサポートし、MCUXpresso IDE などの開発ツールとシームレスに連携します。MCU-Link は、その汎用性と手頃な価格が特に注目されており、愛好家、教育関係者、プロフェッショナルな開発者のいずれにとっても利用しやすい選択肢となっています。