LEDルーレット

さて、次のアプリケーションをビルドするところから始めましょう。

私は、このアプリケーションを実装するための高レベルなAPIを提供します。しかし、心配しないで下さい。低レベルな事項も、後ほど扱います。 この章の主な目的は、Flashに書き込むこととデバッグプロセスに慣れることです。

この文書を通して、discoveryレポジトリにあるスターターコードを使います。 常に手元のコードが、最新バージョンのmasterブランチであることを確かめて下さい。このウェブサイトは、masterブランチに追従しています。

スターターコードは、discoveryレポジトリの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;

    // 無限ループ。このスタックフレームから抜けないためのものです。
    loop {}
}

マイクロコントローラのプログラムは2つの点で通常のプログラムとは異なります。#![no_std]#![no_main]です。

no_stdアトリビュートは、プログラムがstdクレートを使わないことを意味しています。stdクレートはOSが基盤として存在していることを前提としています。 マイクロコントローラのプログラムは、代わりに、coreクレートを使います。 coreクレートはstdのサブセットで、ベアメタルシステム(つまり、ファイルやソケットと言ったOSの抽象化なしに動作するシステム)で動作することができます。

no_mainアトリビュートは、このプログラムが標準のmainインタフェースを使わないことを意味します。標準のmainインタフェースは、 引数を受け取るコマンドラインアプリケーション向けに作られています。 カスタムエントリーポイントを定義するために、標準のmainの代わりに、cortex-m-rtからentryアトリビュートを使います。 このプログラムでは、「main」という名前のエントリーポイントを持ちますが、どのような名前でも使えます。 エントリーポイントの関数はfn() -> !のシグネチャを持つ必要があります。このシグネチャ型は、関数が返らないことを示しています。 これは、このプログラムが停止しないことを意味します。

注意深く観察すると、Cargoプロジェクトに.cargoディレクトリがあることに気づくでしょう。 このディレクトリはCargoの設定ファイル(.cargo/config)を含んでいます。この設定ファイルは、 ターゲットデバイスで要求されるプログラムのメモリレイアウトに合わせて、リンクプロセスを微調整します。 この修正が加えられたリンクプロセスは、cortex-m-rtクレートで求められます。

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