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.gitausfü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 runsollte 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 cargolegt das neue Projekt ancargo build --release --features nativebaut 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 --releaseaus. 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.