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

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 に追加の調整を加えていきます。

それでは、このプログラムをビルドするところから始めましょう。