トグルしてみよう
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 秒ごとに数十万回 — おそらくは数百万回 — 点灯と消灯を繰り返しています。人間の目ではとても追いつけません。
トグルの間にしばらく待つ必要があります。実は、待つことがいちばん難しいのです。