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:

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

  https://github.com/espressif/idf-installer/releases
  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
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

Viel Spass!

ESP32

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:

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.