Heut Abend ging es also hoch motiviert ans Werk – mit Erfolg. Nach etwas Kampf mit den verschiedenen mäßig dokumentierten Ressourcen zu Rust Programmierung für AVR Targets läuft es nun also. Alles bisher einfach noch so "zusammengehackt", aber das kann man sicher noch aufräumen. Die Verwendung von Raw-Pointern erfordert in Rust das "unsafe" Keyword und hebelt die Spracheigenen Checks daher an manchen Stellen aus. Das wird sich für den Hardware-Zugriff wohl nicht umgehen lassen, jedoch großteils in Libraries verschieben lassen. Der Code den man als Entwickler dann schlussendlich schreibt, kann sich meiner Meinung nach schon sehen lassen:
Code:
#![no_std]
#![no_main]
use rp6::*;
/// entry point for the embedded rust program
#[no_mangle]
pub extern "C" fn main() {
RobotBase::init();
UART::write_str("Hello world!\n");
let init_leds: u8 = 0b001001;
let mut running_light: u8 = init_leds;
loop {
// set LEDs according to the binary number `running_light`
RobotBase::set_leds(running_light);
// sleep for one second
delay_ms(250);
// shift to the left for the 'running' effect
running_light <<= 1;
// reset to the initial LED pattern after the last LED was lit
if running_light > 0b111111 {
running_light = init_leds;
}
}
}
Für mehr Details hab ich das Projekt schon mal auf Github gepackt. Ich werde sicherlich in den nächsten Tagen noch eine Beschreibung basteln, was man für den Build alles für Dependencies hat. Falls es jemand nicht erwarten kann, schaut mal nach "rustup override set nightly" (verwenden alle Rust AVR Projekte) und verwendet das Makefile im Repository. Was sind denn so generell die Meinungen vom ersten Eindruck? Könnte sich jemand vorstellen, dass Rust auch hier im (Hobby-)Embedded-Bereich eine Rolle spielen könnte? Mir gefällt, dass es eine wirklich moderne und mächtige Sprache ist, und ich freue mich insbesondere darauf ihre Pattern-Matching Features nutzen zu können. Das sorgt in der Regel für echt übersichtlichen Code, bei dem vor allem garantiert wird dass man keinen Fall vergessen hat. Mal sehen, wie gut sich das auf den Embedded-Bereich überträgt.
Nächste Schritte:
Man sieht vlt. im Github Repo schon in welche Richtung ich gerade tendiere. Das Modul "avr" ist aus dem ruduino Crate zusammenkopiert, da ich den leider nicht als Dependency zum laufen bekommen habe. Die Idee wäre jedenfalls, deren Traits für Register und Pins wiederzuverwenden, dann bräuchte ich selbst in der Library kaum mehr "unsafe" Code schreiben. Zusätzlich wollte ich mir gerne noch diese HAL anschauen. Mal sehen, ob er den Atmega32 richtig abbilden kann, dann käme das auch in Betracht.
So, es ist schon spät. Gute Nacht,
Roland
Lesezeichen