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
それでは、次のアプリケーションを作るところから始めましょう:
このアプリを実装するための高レベル 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 を有効にしたいこと。これはデバッグ手順で必要になります それでは、このプログラムをビルドするところから始めましょう。
このアプリを実装するための高レベル API はこれから提供しますが、心配はいりません。低レベルなことは後で扱います。この章の主な目的は、書き込み とデバッグのプロセスに慣れることです。
スターターコードは、この本のリポジトリの src ディレクトリにあります。そのディレクトリの中には、この本の各章の名前が付いたディレクトリがさらにあります。それらのディレクトリのほとんどは、スターター用の Cargo プロジェクトです。
src
では、src/05-led-roulette ディレクトリに移動してください。src/main.rs ファイルを確認しましょう:
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]
#![no_main]
no_std 属性は、このプログラムが基盤となる OS を前提とする std クレートを使わないことを意味します。代わりに、std のサブセットであり、ベアメタルシステム(つまり、ファイルやソケットのような OS の抽象化を持たないシステム)上で動作できる core クレートを使います。
no_std
std
core
no_main 属性は、このプログラムが引数を受け取るコマンドラインアプリケーション向けに設計された標準の main インターフェースを使わないことを意味します。標準の main の代わりに、cortex-m-rt クレートの entry 属性を使ってカスタムのエントリポイントを定義します。このプログラムではエントリポイントに “main” という名前を付けていますが、ほかのどんな名前でも使えました。エントリポイント関数は fn() -> ! というシグネチャでなければなりません。この型は、その関数がリターンできないことを示します。つまり、このプログラムは決して終了しません。
no_main
main
cortex-m-rt
entry
fn() -> !
注意深く見ているなら、Cargo プロジェクト内に .cargo ディレクトリもあることに気づくでしょう。このディレクトリには Cargo の設定ファイル(.cargo/config)が入っており、ターゲットデバイスの要件に合わせてプログラムのメモリレイアウトを調整するために、リンク処理を変更しています。この変更されたリンク処理は、cortex-m-rt クレートの要件です。
.cargo
.cargo/config
さらに、Embed.toml ファイルもあります
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 に次のことを伝えています:
cargo-embed
nrf52833
nrf51822
それでは、このプログラムをビルドするところから始めましょう。