移植性
(このセクションは任意です。next section に進んでも構いません。そこではコードを少し整理して、今日はこれで終わりにします。)
この手の凝ったエコシステムにそれだけの価値があるのか、疑問に思うかもしれません。今回の blinky のセットアップは かなり凝っていて、このような単純な仕事のために Rust のクレートや機能をたくさん使っています。
ただし、優れた利点の 1 つは、コードの移植性が非常に高くなることです。別のボードではセットアップは 異なるかもしれませんが、実際の blinky ループはまったく同じです!
Sipeed Longan Nano 向けの blinky を見てみましょう。これは 5 ドルほどの小さなボードで、MB2 と同様に、 MCU を備えた組み込みボードです。そのほかの点では、まったく異なります。プロセッサも異なり (GD32VF103 で、私たちが使っている Arm 命令セットとは完全に異なる RISC-V 命令セットを持っています)、 周辺機器も異なり、ボードも異なります。しかし、GPIO ピンに LED が接続されているので、blinky できます。
#![no_std]
#![no_main]
use panic_halt as _;
use riscv_rt::entry;
use gd32vf103xx_hal::{pac, prelude::*, delay::McycleDelay};
use embedded_hal::{blocking::delay::DelayMs, digital::v2::OutputPin};
#[entry]
fn main() -> ! {
let dp = pac::Peripherals::take().unwrap();
let mut rcu = dp.RCU.configure().ext_hf_clock(8.mhz()).sysclk(108.mhz()).freeze();
let gpioc = dp.GPIOC.split(&mut rcu);
let mut led = gpioc.pc13.into_push_pull_output();
let mut delay = McycleDelay::new(&rcu.clocks);
loop {
delay.delay_ms(500);
led.set_high().unwrap();
delay.delay_ms(500);
led.set_low().unwrap();
}
}
ここでのセットアップの違いは、一部はハードウェアが異なるためであり、また一部はこのコードが
まだ embedded-hal 1.0 に更新されていない古い HAL クレートを使っているためです。それでも、メインループは
予告どおり同一で、残りのコードもかなり見覚えのあるものです。Rust の容易なクロスコンパイルと
組み込み Rust エコシステムがもたらす移植性のおかげで、blinky はどこでも blinky なのです。
すべての詳細を見たい場合や、自分のボードを手に入れて実際に試してみたい場合は、GitHub で完全に動作する nanoblinky の例を見つけることができます。