締め切りがあって急ぎで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