Cómo crear, construir, flashear y simular una aplicación “Hello World” Rust Bare Metal para ESP32-S3

Rust es un gran lenguaje de programación para el desarrollo de dispositivos embebidos como los MCU, que tienen recursos limitados. Especialmente, Bare Metal (también conocido como no_std) trae muchas ventajas y permite la creación de aplicaciones completas puramente en Rust.

Los siguientes pasos describen cómo crear, construir, flashear y simular una aplicación para ESP32-S3, que está incluida en muchos DevKits como el ESP32-S3-BOX-3 o el M5Stack CoreS3.

Hay varias herramientas que necesitan ser instaladas.

Primero, necesitamos instalar Rust. Usaremos rustup.

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

Necesitaremos varias herramientas adicionales. Podemos usar `cargo install` para realizar la instalación desde el código fuente. El método más rápido es usar cargo-binstall, que despliega binarios de herramientas y ahorra tiempo en comparación con la instalación desde el código fuente.

curl -L --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/cargo-bins/cargo-binstall/main/install-from-binstall-release.sh | bash

Ahora podemos instalar herramientas adicionales:

  • espup – Herramienta para instalar y mantener el ecosistema Rust de Espressif.
  • cargo-generate – Herramienta para crear proyectos Rust a partir de plantillas.
  • espflash – Utilidad de flasheo serial para SoCs y módulos de Espressif. Reemplazo en Rust para esptool.py basado en Python.
cargo binstall espup cargo-generate espflash

Como estamos apuntando al ESP32-S3, que está basado en la arquitectura Xtensa, necesitaremos la toolchain Xtensa de Rust, que debe ser instalada por separado. Nota: Para los chips introducidos después del ESP32-S3, como el ESP32-C3, que están basados en la arquitectura RISC-V, esta dependencia no es necesaria.

espup install
source ~/export-esp.sh

Ahora podemos generar un proyecto usando la plantilla Bare Metal de esp-rs/esp-template utilizando cargo-generate. La herramienta hará varias preguntas. Aquí está la configuración recomendada:

cargo generate esp-rs/esp-template
   Project Name: embedded-rust
   Destination: /home/georgik/projects/embedded-rust ...
   project-name: embedded-rust ...
   Generating template ...
✔    Which MCU to target? · esp32s3
✔    Configure advanced template options? · true
✔    Enable allocations via the esp-alloc crate? · true
✔    Enable WiFi/Bluetooth/ESP-NOW via the esp-wifi crate? · false
✔    Configure project to use Dev Containers (VS Code and GitHub Codespaces)? · true
✔    Configure project to support Wokwi simulation with Wokwi VS Code extension? · true
✔    Add CI files for GitHub Action? · true
✔    The template is requesting to run the following command. Do you agree?
cargo fmt · yes
   Moving generated files into: `/home/georgik/projects/embedded-rust`...
   Initializing a fresh Git repository
✨   Done! New project created /home/georgik/projects/embedded-rust

El proyecto `embedded-rust` debería estar creado, y ahora estamos listos para construir y flashear.

Se recomienda construir el proyecto en el perfil Release, debido a las consideraciones de rendimiento, especialmente si planeas usar WiFi, que requiere muchos recursos, y el perfil de depuración es demasiado lento.

Conecta el ESP32-S3-BOX-3 a tu computadora usando un cable USB y escribe el siguiente comando, que invocará un comando de construcción y espflash con la opción de monitor para flashear y monitorear el hardware.

cd embedded-rust
cargo run --release

Si no tienes el ESP32-S3-BOX-3 contigo, es posible usar el simulador Wokwi. Abre VS Code:

code .

Instala la extensión Wokwi para VS Code (Ctrl+Shift+P), selecciona “Install extension”, busca Wokwi y haz clic en “install”.

Activa la licencia gratuita de Wokwi (Ctrl+Shift+P), selecciona “Wokwi: Request a new license” y sigue el proceso de activación en el navegador web.

Si el proyecto fue creado en el perfil Release, necesitamos cambiar la ruta al binario en el archivo `wokwi.toml`:

[wokwi]
version = 1
elf = "target/xtensa-esp32s3-none-elf/release/embedded-rust"
firmware = "target/xtensa-esp32s3-none-elf/release/embedded-rust"

Ejecuta la simulación (Ctrl+Shift+P), selecciona “Wokwi: Start Simulator”.

El chip simulado debería aparecer y deberías obtener el siguiente resultado:

ESP-ROM:esp32s3-20210327
Build:Mar 27 2021
rst:0x1 (POWERON),boot:0x8 (SPI_FAST_FLASH_BOOT)
SPIWP:0xee
mode:DIO, clock div:1
load:0x3fce3808,len:0x370
load:0x403c9700,len:0x900
load:0x403cc700,len:0x2364
entry 0x403c98ac
INFO - Hello world!

¡Felicidades! Has completado tu primer proyecto Rust Bare Metal para ESP32-S3-BOX-3.

Consejo de productividad: Puedes mantener la ventana de Wokwi con el simulador abierta mientras desarrollas la aplicación. Una vez que construyas la aplicación usando `cargo run –release`, el simulador tomará el cambio y te mostrará la simulación, incluso mientras esperas a que se complete el proceso de flasheo. Esto puede ahorrar mucho tiempo permitiéndote ver los resultados de un cambio de código de inmediato.