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 はこれから提供しますが、心配はいりません。低レベルなことは後で扱います。この章の主な目的は、書き込み とデバッグのプロセスに慣れることです。

スターターコードは、この本のリポジトリの src ディレクトリにあります。そのディレクトリの中には、この本の各章の名前が付いたディレクトリがさらにあります。それらのディレクトリのほとんどは、スターター用の Cargo プロジェクトです。

では、src/05-led-roulette ディレクトリに移動してください。src/main.rs ファイルを確認しましょう:

#![deny(unsafe_code)]
#![no_main]
#![no_std]

use cortex_m_rt::entry;
use panic_halt as _;
use microbit as _;

#[entry]
fn main() -> ! {
    let _y;
    let x = 42;
    _y = x;

    // infinite loop; just so we don't leave this stack frame
    loop {}
}

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

no_std 属性は、このプログラムが基盤となる OS を前提とする std クレートを使わないことを意味します。代わりに、std のサブセットであり、ベアメタルシステム(つまり、ファイルやソケットのような OS の抽象化を持たないシステム)上で動作できる core クレートを使います。

no_main 属性は、このプログラムが引数を受け取るコマンドラインアプリケーション向けに設計された標準の main インターフェースを使わないことを意味します。標準の main の代わりに、cortex-m-rt クレートの entry 属性を使ってカスタムのエントリポイントを定義します。このプログラムではエントリポイントに “main” という名前を付けていますが、ほかのどんな名前でも使えました。エントリポイント関数は fn() -> ! というシグネチャでなければなりません。この型は、その関数がリターンできないことを示します。つまり、このプログラムは決して終了しません。

注意深く見ているなら、Cargo プロジェクト内に .cargo ディレクトリもあることに気づくでしょう。このディレクトリには Cargo の設定ファイル(.cargo/config)が入っており、ターゲットデバイスの要件に合わせてプログラムのメモリレイアウトを調整するために、リンク処理を変更しています。この変更されたリンク処理は、cortex-m-rt クレートの要件です。

さらに、Embed.toml ファイルもあります

[default.general]
# chip = "nrf52833_xxAA" # uncomment this line for micro:bit V2
# chip = "nrf51822_xxAA" # uncomment this line for micro:bit V1

[default.reset]
halt_afterwards = true

[default.rtt]
enabled = false

[default.gdb]
enabled = true

このファイルは、cargo-embed に次のことを伝えています:

  • nrf52833 または nrf51822 のどちらかを使っていること。ここでも 3 章で行ったのと同じように、使用しているチップに対応するコメントを外す必要があります。
  • 書き込み後にチップを停止させたいこと。これにより、プログラムが即座にループへ飛ばないようにします。
  • RTT を無効にしたいこと。RTT は、チップがデバッガにテキストを送信できるようにするプロトコルです。 実際、RTT が動作しているところはすでに見ています。3 章で “Hello World” を送っていたのがそのプロトコルでした。
  • GDB を有効にしたいこと。これはデバッグ手順で必要になります

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