Rust begegnet mir immer wieder: Zum Beispiel wenn ich wieder einmal ein Memory-Leak suche oder einen Fehler habe weil ich eine Variable vom Stack zu lange verwende. Dann kommen unweigerlich Gespräche auf, die auf Rust hoffen, dass damit mal Schluss sein wird. Auch in unseren Blogbeiträgen gibts bereits Artikel zu Rust, zum Beispiel wie Rust für den Raspberry Pi Pico aufgesetzt wird. Doch direkte Berührungspunkte hatte ich bis jetzt noch keine. Um ein fundiertere Aussage über den Stand von Rust auf einem Microcontroller machen zu können, durfte ich mich 3 Tage mit Rust beschäftigen, mit dem Ziel, eine einfache Applikation mit digitalen In- und Outputs und Uart in Rust auf einem Microcontroller zu erstellen und den Start in die Rust-Welt auf einem Microcontroller zu wagen.
Glücklicherweise hatte ich bereits einen Link gespeichert, der perfekt dazu passt. Es gibt vom Google Android-Team einen öffentlich zugänglichen Kurs genau zu diesem Thema. Dieser ist für 3 Tage Grundlagen und 1 Tag Bare-Metal Entwicklung ausgelegt. Mit ein wenig Einsatz schafft man dies in 3 Tagen (im Selbststudium hat man ja leider keinen erfahrenen Kursleiter, der den Unterricht mit passenden Anekdoten ausschmückt).
Hier folgt also eher eine Linksammlung bereits bestehender guter Anleitungen statt einem weitern Versuch den Start zu erleichtern. Abschliessend gibts noch ein kurzer Erfahrungsbericht zum Kurs, respektive zum Start mit Rust auf dem micro:bit V2. Dazu noch ein paar Tipps.
Die Installation
Wie also starte ich auf einem Microcontroller. Dazu brauchen wir natürlich eine Entwicklungsumgebung und einen Evalboard. Als Entwicklungsumgebung eignet sich z.B. Visual Studio Code (auch VS Code oder nur Code genannt) und als Evalboard bietet es sich an den vom Kurs zu nehmen, den micro:bit V2.
Die Installationsschritte sind entweder von der Rust-Comunity oder von Microsoft so gut beschrieben, dass die Installation reibungslos verlief. Deshalb verzichte ich auf eine detaillierte Anleitung und verweise gerne auf die gut gewarteten Anleitungen.
Installation von VS Code mit WSL
Für ein Linux-Feeling unter Windows verwende ich die WSL-2 mit einem Ubuntu. Es gibt eine Anleitung von Microsoft wie man VS Code für die Verwendung von WSL einrichtet.
Installation von Rust in WSL
In der WSL kann Rust wie in einem Ubuntu installiert werden.
Erweiterung für USB Devices in WSL
Damit der micro:bit in der WSL-Umgebung verwendet werden kann, muss das USB-Device in die WSL geroutet werden. Auch dazu gibt es bereits eine fix fertige Anleitung. Beachte die extra Note für Win10.
Tipps
- Beachte, dass die VS Code Erweiterung für Rust erst installiert wird, nachdem VS Code mit WSL gestartet wurde, sonst wird das Plugin für den Windows-Host installiert und ist damit nicht verfügbar.
- Damit der Linter in VS Code funktioniert, muss der Ordner im root des aktuellen Projekts geöffnet werden. Hier ist ein Plugin um einen Unterordner in einem neuen Fenster zu öffnen.
Zum Kurs Comprehensive Rust
Der Start in die Rust-Welt
Der Kurs ist in einen Reader integriert. Die Codebeispiele können direkt darin verändert und getestet werden und erleichterte mir das Verständnis. Für grössere Änderungen lohnt es sich aber ein neues Projekt zu erstellen. Denn verlässt man die Seite, sind die Änderungen weg.
Das Kurs Git Repository enthält neben den Source-Files der Unterlagen auch die Beispiele. So hat man Theorie und Übungen fertig vorliegend für den Start in die Rust-Welt auf einem Microcontroller.
Inhalt
Den Kurs finde ich sehr gut strukturiert: Einmal durch die Theorie, kurz und kompakt, danach gibt es sehr gute Beispiele und saubere Lösungen. So sind auch die Übungen für das Selbststudium geeignet. Nebst einfachen Konsolen-Übungen gibt es auch eine Übung mit einem Arm in QEMU und natürlich auf dem bereits erwähnten micro:bit. Während dem Flashen stieg mein Puls an und als der darauf verbaute Beschleunigungssensor seine Werte ausspuckte konnte diese aufgebaute Energie in ein breites lächeln verwandelt werden.
Zur Rust-Welt auf dem Microcontroller
Hier noch ein paar Anmerkungen zu Rust, nach Bearbeitung des Kurses. Mir ist natürlich bewusst, dass der micro:bit gut unterstützt ist und die Beispiele sehr gut vorbereitet sind. Ich bin zuversichtlich, dass andere Microcontroller ebenfalls bereits gut unterstützt sind und weitere folgen. Die Hardware-Abstraktion ist momentan noch vor allem synchron, doch diese wird sicher für asynchrone Ausführung verbessert und erweitert.
Was mich begeisterte an Rust
Es gibt im Wesentlichen 2 Aspekte, die mich besonders begeistert haben.
Erstens: Man fightet zwar sehr lange mit dem Compiler, bis er zufrieden ist und alle Typen stimmen, danach ist aber die Wahrscheinlichkeit sehr hoch, dass das Programm läuft. Das ist gegensätzlich zu meinen Erfahrungen mit Python, wo ich zwar sehr schnell den Code zusammen habe, aber das Programm x-mal starten muss, bis ich alle Konvertierungen korrekt umgesetzt habe.
Zweitens: Die Differenzierung zwischen Interface und Implementation. Es scheint einfach zu sein ein Modul für ein Interface zu erstellen und danach das, was darunter liegt und das Modul zu „verknüpfen“. Das geht auch bei beiden Beispielen hervor: Die Interfaces existieren und können einfach gelinkt werden.
Was mir noch Schwierigkeiten bereitete mit Rust
Es gibt auch Aspekte, die mir noch Mühe bereiten mit Rust. Dazu gehört natürlich das Memorymanagement. Das wird wohl einige Zeit gehen, bis ich das intus habe und Funktionen im Vorherein auch richtig designe und nicht erst aufgrund von Compiler-Warnungen etwas anpasse. Nebst diesem Hauptpunkt gibt es noch 2 Punkte:
Erstens: Das Result-Handling von Funktionen, wie genau verwende ich das Some/None Konstrukt am besten und gibt es Fälle wo das Ok() / Err() Konstrukt mit einem Enum besser geeignet ist. Das nachfolgende matching auf die Ergebnisse macht dann natürlich ebenfalls noch ein wenig Mühe. Daran muss ich mich erst noch gewöhnen.
Zweitens: Sobald Interrupts vom Microcontroller verwendet werden, wurde es für mich unübersichtlich. Wie werden Interrupts korrekt definiert und angewendet: Wie genau werden critical sections definiert. Dieses Thema muss ich definitiv noch vertiefen.
Ausblick
Wer also noch eine Beschäftigung für über die Weihnachtsferien sucht, ein kleines Projekt mit Rust auf dem micro:bit bietet sich sehr gut an. Der hier erwähnte Kurs gibt einen sehr guten Start.
Ansonsten freue ich mich, mal ein industrielles Embedded-Rust Projekt (zuerst mal im kleinen Rahmen) umzusetzen und mich damit weiter zu vertiefen, denn der Start in die Rust-Welt auf einem Microcontroller ist gelungen.
Was sind deine Erfahrungen mit Rust? Hast du diesen Kurs ebenfalls durchgearbeitet? Gibt es andere Materialien die du empfehlen kannst? Lass uns gerne unten in den Kommentaren darüber austauschen.