Quickstart für Arduino und ESP32 Projekte in Rust
Warum Rust
Rust ist als “Systems Programming Language” vorgesehen und spielt daher in einer Liga mit C/C++. Der Code wird direkt auf nativen Code übersetzt und dadurch dass keine Runtime notwendig ist, ist sie sogar Sprachen wie C++ überlegen.
Leider hat Rust auch ein paar Nachteile wovon der gravierendste ist, dass die Sprache noch recht jung ist und dadurch die verfügbaren Hilfsmittel/Treiber/Bibliotheken noch eher rar sind - doch das ändert sich glücklicherweise. 👍
Eine Einleitung, wenn auch inzwischen ein wenig überholt, findet ihr im Embedded Rust Book.
Notwendige Voraussetzungen
Fürs Cross-Kompilieren des Codes ist für die jeweilige Plattform auch ein Compiler und Linker sowie die Rust-Toolchain zu installieren.
Arduino Toolchain
Ich habe hier die Schritte aus How to Rust on Arduino entnommen. Die wichtigsten Schritte:
- Installation der AVR-Compiler und Linker (avr-gcc) und Tools (arduino-avr-core)
- Umstellen auf Rust-Nightly für das Projekt (Bitte erst machen nachdem das Projekt angelegt wurde - siehe weiter unten) -
AVR-GCC und die ARDUINO-AVR-CORE bitte je nach Plattform (apt, homebrew, Windows Installer) installieren.
Als Tool zum flashen dann einfach noch cargo ravedude nachinstallieren:
cargo install ravedude
ESP32 Toolchain
Hier gibts eine sehr gute Anleitung im The Rust on ESP Book
- Installation des Compilers und der Tools
- Windows:
https://github.com/espressif/idf-installer/releases
- Linux / Mac:
curl -LO https://raw.githubusercontent.com/esp-rs/rust-build/main/install-rust-toolchain.sh
chmod +x install-rust-toolchain.sh
./install-rust-toolchain.sh
- Rust-Toolchain - bin nicht sicher ob “nightly” nch benötigt wird
rustup toolchain install nightly
rustup default nightly
rustup target add riscv32imc-unknown-none-elf
Ein kleines Cargo-Tool das auch benötigt wird is ldproxy
. Installier das auch noch mit den Flash und Monitor-Tools
cargo install ldproxy espflash espmonitor
Das Ausführen von rustup toolchain list
sollte dann einen Toolchain mit Namen esp
enthalten. Sonst bitte nochmals den ersten Schritt überprüfen.
Starten des Projekts
Am Einfachsten ist es hier die cargo generate
Funktion zu nutzen. Diese muss erst installiert werden mittels:
cargo install cargo-generate
ist auch das erledigt.
Arduino
- Ein neues Verzeichnis fürs Projekt anlegen
cargo generate --git https://github.com/Rahix/avr-hal-template.git
ausführen- Bei mir musste ich dann noch auf nightly umstellen mit
rustup override set nightly
- bin aber nicht sicher ob es nicht auch in “stable” funktioniert cargo run
sollte dann ein Beispiel kompilieren und gleich auf den Arduino flashen
Viel Spass!
ESP32
- Ein neues Verzeichnis fürs Projekt anlegen
cargo generate --git https://github.com/esp-rs/esp-idf-template cargo
legt das neue Projekt ancargo build --release --features native
baut das neue Projektespflash --monitor <serial port> target/xtensa-esp32-espidf/release/<binary name>
flasht das ganze dann auf den ESP (Bitte daran denken den “BOOT”-Button zu halten und vorher noch einen Reset auszuführen)cargo espmonitor <serial port>
kann man später verwenden, um an die Ausgaben vom ESP zu kommen
Beim ESP32 kann man überdies auch std
verwenden - also man kann auch println!
und alle anderen Annehmlichkeiten der Rust-Standard-Library verwenden.
Wenn das Bauen nicht klappt (Anmerkung vom 9.1.2022)
Ich hatte das Problem, dass cargo build --release --features native
nach update auf die neueste esp-idf-sys - Library nicht mehr funktioniert hat:
Workaround:
- führe
cargo build --release
aus. Wenn danach Fehler auftauchen liegt es höchstwahrscheinlich an einem Problem mit PlattformIO, dass nach der aktuellen git-head-version sucht.
CMake Error at .pio/build/debug/CMakeFiles/git-data/grabRef.cmake:48 (file):
file failed to open for reading (No such file or directory):
<Pfad zum Verzeichnis>/target/xtensa-esp32-espidf/debug/build/esp-idf-sys-f84717bbd0cff30e/out/esp-idf/.pio/build/debug/CMakeFiles/git-data/head-ref
...
========================== [FAILED] Took 2.40 seconds ==========================
Environment Status Duration
------------- -------- ------------
debug FAILED 00:00:02.400
==================== 1 failed, 0 succeeded in 00:00:02.400 ====================
Error: No such file or directory (os error 2)
Bitte einfach entweder das .git
verzeichnis löschen, oder ein einfaches git add .
und git commit -m "initial checkin"
ausführen. Dann klappt das bauen mit PlattformIO.
Nachwort
Ich war sehr überrascht, dass sich in den letzten paar Monaten hier sehr viel getan hat, und der Übergang von “ich kann zwar Rust verwenden, aber ich muss es von C aus aufrufen” zu “ja, es geht” so schnell war.
Großes Lob an die Community!
Für Hardware-Unterstützung, Libraries und Ähnliches möchte ich hier noch auf das Awesome embedded Rust Verzeichnis verweisen. Dort findet ihr Treiber für Displays, Peripheriebausteine u.s.w.
Viel Spass beim Rust-Coden.