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