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

移植性

(このセクションは任意です。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 の例を見つけることができます。