Hallo zusammen,

mal wieder ein kleines Update von mir! Ich lerne bei dem Projekt doch auch einiges über die low-level Features von Rust – ganz anders als in der Arbeit wo es eher um parallele Datenstrukturen und Skalierbarkeit geht. Wirklich spannend, aber ich möchte mir auch die Zeit nehmen die Dinge richtig zu implementieren!

Ich habe nun schon mal die UART Schnittstelle angebunden, zumindest schreibend. Ein paar Dinge habe ich dabei zum Beispiel gelernt:
- Es wäre ja zu schade das Rust-Typensystem nicht vernünftig zu nutzen. Ich musste etwas rumprobieren, aber nun gibt es eine vernünftige API die etwa so benutzt werden kann:
Code:
Serial::write("Hier kann man einfach irgendetwas übergeben.");
Serial::write('E');
Serial::write('i');
Serial::write('n');
Serial::write('e');
Serial::write("Zahl: ");
Serial::write(1337);
Serial::write(" oder was auch immer das den Trait `SerialWritable` implementiert.");
Serial::new_line();

// Alternativ gibt es auch ein Macro für Convenience. Bei Zeiten möchte ich mir auch
// mal proc_macros ansehen und damit ein schöneres `format!` Macro bauen.
println!("Counter: ", counter, " (DEC) | ", counter => hex, "(HEX)");
- Rust's eingebaute Formatter sind wahre Monster (zumindest für den Embedded-Einsatz): https://jamesmunns.com/blog/fmt-unreasonably-expensive/
- Ich habe also auf `ufmt` umgestellt – das kann leider nur Formatierung als Dezimal- und Hexadezimal Werte, da bin ich also mit einem Pull Request dran das hoffentlich mittelfristig zu ändern: https://github.com/japaric/ufmt/pull/54

Demnächst steht dann an, sich damit auseinanderzusetzen wie ich die Hardware-Interrupts in Rust verarbeiten kann, um auch vernünftige Receive-Funktionen bauen zu können. Mal sehen wann ich wieder Zeit finde


LG Roland

- - - Aktualisiert - - -

Ach ja, ich denke ich hatte noch gar nichts über die Fortschritte bei der sonstigen Library geredet. Es gibt jedenfalls nun eine Hardware-Abstraktion für alle Pins, basierend auf dem `avrd` crate (auch wenn der Bitmasken leider seltsam definiert...: https://github.com/avr-rust/avrd/issues/22)
https://github.com/Pr0gm4n/rust-rp6l...t_base/port.rs

Und damit sieht die Implementierung von Basis-Funktionen meiner Meinung nach schon sehr lesbar aus:
https://github.com/Pr0gm4n/rust-rp6l...ase/mod.rs#L86

Was meint Ihr dazu? Ein paar Namen habe ich nach wie vor einfach aus der RP6Lib übernommen, da ich mich noch nicht mit den zugehörigen Pins beschäftigt habe.


LG und Gute Nacht,
Roland