chakokuのブログ(rev4)

テック・コミック・DTM・・・ごくまれにチャリ

組み込みRust再々入門(Lチカ on ESP32C3)

教科書ではこの次はHTTP接続に行くのだが、いきなりHTTPは敷居が高いので、地道にLチカをやってみたい。Lチカはむしろ、no_stdが似つかわしいサンプルなのだが、no_stdだとHTTP/MQTT等はできない(?)と思われ、stdでのLチカを試作してみる。

Rustで0からLチカ書くなんてできないので、さっさとサンプルを見る。
esp-idf-hal/blinky.rs at master · esp-rs/esp-idf-hal · GitHub
使うライブラリは、esp-idf-halのようだった。 halはHardware Abstraction Layer(ハード抽象化)
ソースは以下(少し編集した。 flushが働かず、シリアルからの入力なし)

use esp_idf_hal::delay::FreeRtos;
use esp_idf_hal::gpio::PinDriver;
use esp_idf_hal::peripherals::Peripherals;

use std::io::{self, Write};


use log::*;

fn main()-> anyhow::Result<()> {
    esp_idf_sys::link_patches();
    esp_idf_svc::log::EspLogger::initialize_default();
    info!("Hello, world!");
    println!("#####  Hello, world! #####");
    let peripherals = Peripherals::take().unwrap();
    let mut led = PinDriver::output(peripherals.pins.gpio7)?;

    loop{
        led.set_high()?;
        print!("1");
        FreeRtos::delay_ms(1000);
        led.set_low()?;
        print!("0");
        FreeRtos::delay_ms(1000);
        io::stdout().flush().unwrap();
    }
}

Cargo.tomlの内容は以下。エラーにならない範囲で不要と思われるモジュールを削減

[package]
name = "blink-from-cg"
version = "0.1.0"
authors = ["sumi"]
edition = "2021"
resolver = "2"
rust-version = "1.66"

[profile.release]
opt-level = "s"

[profile.dev]
debug = true    # Symbols are nice and they don't increase the size on Flash
opt-level = "z"

[features]

default = ["std", "hal", "esp-idf-sys/native"]
pio = ["esp-idf-sys/pio"]
hal = ["esp-idf-hal", "embedded-svc", "esp-idf-svc"]
std = ["alloc", "esp-idf-sys/std", "esp-idf-sys/binstart", "embedded-svc?/std", "esp-idf-hal?/std", "esp-idf-svc?/std"]
alloc = ["embedded-svc?/alloc", "esp-idf-hal?/alloc", "esp-idf-svc?/alloc"]


#all = ["std", "nightly", "experimental", "embassy"]
#nightly = ["embedded-svc?/nightly", "esp-idf-svc?/nightly"] # Future: "esp-idf-hal?/nightly"
#experimental = ["embedded-svc?/experimental", "esp-idf-svc?/experimental"]
#embassy = ["esp-idf-hal?/embassy-sync", "esp-idf-hal?/critical-section", "esp-idf-hal?/edge-executor", "esp-idf-svc?/embassy-time-driver", "esp-idf-svc?/embassy-time-isr-queue"]

[dependencies]
esp-idf-sys = { version = "0.32.1", default-features = false }
esp-idf-svc = { version = "0.45.0", optional = true, default-features = false }
log = { version = "0.4.17", default-features = false }
esp-idf-hal = { version = "0.40.1", optional = true, default-features = false }
embedded-svc = { version = "0.24", optional = true, default-features = false }
anyhow = {version = "1", features = ["backtrace"]}

[build-dependencies]
embuild = "0.31.2"
anyhow = "1"

esp_idf_halのgpio配下のPinDriveを使って、Pinオブジェクト?を作っている(のか?)
PinDriverの仕様書は以下
PinDriver in esp_idf_hal::gpio - Rust
ここで、疑問が、、 embedded-halを使わず、esp-idf-halを使うのはなぜか。 embedded-halは抽象化しすぎて使えない?