LED ルーレット
それでは、次のアプリケーションを作ることから始めましょう。
このアプリを実装するための高水準 API をこれから示しますが、心配はいりません。低レベルなことは後で扱います。この章の主な目標は、フラッシュ書き込み とデバッグのプロセスに慣れることです。
このテキスト全体を通して、discovery リポジトリにあるスターターコードを使用します。この Web サイトはそのブランチを追跡しているので、常に master ブランチの最新バージョンを使うようにしてください。
スターターコードはそのリポジトリの src ディレクトリにあります。そのディレクトリの中には、この本の各章に対応する名前のディレクトリがさらにあります。それらのディレクトリのほとんどは、Cargo のスタータープロジェクトです。
では、src/05-led-roulette ディレクトリに移動しましょう。src/main.rs ファイルを確認してください。
#![deny(unsafe_code)]
#![no_main]
#![no_std]
use aux5::entry;
#[entry]
fn main() -> ! {
let _y;
let x = 42;
_y = x;
// infinite loop; just so we don't leave this stack frame
loop {}
}
マイクロコントローラ向けのプログラムは、#![no_std] と #![no_main] という 2 つの点で通常のプログラムと異なります。
no_std 属性は、このプログラムが基盤となる OS を前提とする std クレートを使わないことを示します。代わりに、このプログラムは core クレートを使います。これは std のサブセットで、ベアメタルシステム(つまり、ファイルやソケットのような OS の抽象化がないシステム)上で動作できます。
no_main 属性は、このプログラムが標準の main インターフェースを使わないことを示します。標準の main は、引数を受け取るコマンドラインアプリケーション向けに作られているためです。標準の main の代わりに、cortex-m-rt クレートの entry 属性を使ってカスタムのエントリポイントを定義します。このプログラムではエントリポイントに “main” という名前を付けていますが、ほかのどんな名前でも使えます。エントリポイント関数は fn() -> ! というシグネチャでなければなりません。この型は、その関数がリターンできないことを示します。つまり、このプログラムは決して終了しません。
注意深く見れば、この Cargo プロジェクトには .cargo ディレクトリもあることに気付くでしょう。このディレクトリには Cargo の設定ファイル(.cargo/config)が含まれており、リンクプロセスを調整して、プログラムのメモリレイアウトをターゲットデバイスの要件に合わせています。この変更されたリンクプロセスは、cortex-m-rt クレートの要件です。さらに、後の節では、ビルドとデバッグをしやすくするために .cargo/config に追加の調整を加えていきます。
それでは、このプログラムをビルドするところから始めましょう。