chakokuのブログ(rev4)

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

組み込みRust再々入門("Hello World" on ESP32C3)

締め切りがあって急ぎでRustで試作したが*1、細かい所が分からないままであった。再々入門する。
サンプルコードのベースにするサイト:
Introduction - The Rust on ESP Book
Introduction - Embedded Rust on Espressif


std版テンプレートを使ってcargoでProjectを作る手順

 cargo generate --git https://github.com/esp-rs/esp-idf-template cargo

ソースは以下であった。HelloWorldをシリアルに出力する(しかも一発だけ)

use esp_idf_sys as _; 
use log::*;
fn main() {
    esp_idf_sys::link_patches();
    esp_idf_svc::log::EspLogger::initialize_default();
    info!("Hello, world!");
}

Cargo.tomlは以下。 info関数だけならこんなにライブラリ要らないのでは?

[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"]
all = ["std", "nightly", "experimental", "embassy"]
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"]
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]
log = { version = "0.4.17", default-features = false }
esp-idf-sys = { version = "0.32.1", default-features = false }
esp-idf-hal = { version = "0.40.1", optional = true, default-features = false }
esp-idf-svc = { version = "0.45.0", optional = true, default-features = false }
embedded-svc = { version = "0.24", optional = true, default-features = false }

[build-dependencies]
embuild = "0.31.2"

ビルドしたらエラーなくビルドできた
以下でES32C3に焼く

TARGET=target/riscv32imc-esp-espidf/debug/blink-from-cg

echo "espflash /dev/ttyACM0 $TARGET"
espflash /dev/ttyACM0 $TARGET

シリアル出力の確認は以下

espflash /dev/ttyACM0 serial-monitor

多分以下がinfoメッセージだと思うのだが。。

I (315) blink_from_cg: Hello, world!

info関数に加え、printlnを使ってみる

use esp_idf_sys as _;
use log::*;

fn main() {
    esp_idf_sys::link_patches();
    esp_idf_svc::log::EspLogger::initialize_default();
    info!("Hello, world!");
    println!("#####  Hello, world! #####");
}

シリアル出力は以下

I (316) blink_from_cg: Hello, world!
#####  Hello, world! #####

困りどころ
RustはDISKを食ってしまう。以下の通りHelloWorldだけなのだが、ライブラリ一式をフォルダ内に取り込んでビルドするせいか、1プロジェクトに3Gも使っている。お決まりのライブラリに対して再利用する方法はないのだろうか。

$ du -h .
         *略*
3.2G    .

cleanしても1.8Gにしかならない。多分ライブラリ群のソース一式でサイズを食っていると思われる

$ cargo clean
$ du -h .
1.8G    .

.embuild配下が原因のようだ。

1.8G    ./.embuild/espressif
1.8G    ./.embuild
1.8G    .

■参考URL
組み込みRust(ESP版)まとめ記事
GitHub - esp-rs/awesome-esp-rust: Curated list of resources for ESP32 development in the Rust programming language

Introduction - The Rust on ESP Book
Introduction - Embedded Rust on Espressif
Using the Standard Library (std) - The Rust on ESP Book
大いに助かったlang-ship様の記事(試作はずっとエラーで悩まされていたのだが、この記事で大幅に進んだ)
ESP32でstdなRust開発入門 その1 環境構築 | Lang-ship

*1:そして不採用 orz