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 を繰り返しオンとオフにしてみましょう。そうやって点滅させるのですよね?

examples/fast-blink.rs には、私たちの blinky の次のバージョンがあります。元の LED は点灯したままにして、その隣の LED を点滅させることにしました。これは簡単な変更です。

#![no_main]
#![no_std]

use cortex_m_rt::entry;
use embedded_hal::digital::OutputPin;
use nrf52833_hal::{gpio, pac};
use panic_halt as _;

#[entry]
fn main() -> ! {
    let peripherals = pac::Peripherals::take().unwrap();
    let p0 = gpio::p0::Parts::new(peripherals.P0);
    let _row1 = p0.p0_21.into_push_pull_output(gpio::Level::High);
    let mut row2 = p0.p0_22.into_push_pull_output(gpio::Level::Low);
    let _col1 = p0.p0_28.into_push_pull_output(gpio::Level::Low);

    loop {
        row2.set_high().unwrap();
        row2.set_low().unwrap();
    }
}

ここでは、LED を点灯・消灯するために必要な Rust のトレイトを提供するために embedded-hal クレートが使われています。これは、このコードのこの部分が、私たちの HAL と同様に embedded-hal トレイトを実装している任意の Rust HAL に移植可能であることを意味します。

でも待ってください。どちらの LED も点滅していません! 2 つ目のほうが 1 つ目より少し暗いですが、どちらもしっかり点灯したままです……本当にそうでしょうか? MB2 は箱から出したそのままの状態で、1 秒あたり 64 百万 命令を実行します。内部的には、LED を点灯または消灯するのに数十命令かかると仮定しましょう。(おそらくそれくらいかかるのは debug モードでコンパイルした場合で、release モードならずっと少ないでしょう。とはいえ、ピンが状態を変えるのには少し時間がかかります。よく分かりません。) ともかく、その 2 つ目の LED は実際には 1 秒ごとに数十万回 — おそらくは数百万回 — 点灯と消灯を繰り返しています。人間の目ではとても追いつけません。

トグルの間にしばらく待つ必要があります。実は、待つことがいちばん難しいのです。