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
クレートで求められます。
では、プログラムをビルドするところから始めましょう。