Technologie Notdienst Nachrichten Fragen Sie HN: Ist irgendein Rust-Entwickler zur Embedded-Device-Programmierung übergegangen?
Technologie Notdienst Nachrichten Fragen Sie HN: Ist irgendein Rust-Designer zu etablierten Gadget-Shows umgezogen? 47 Punkte von detuks vor 3 Stunden|verbergen|vorherige|bevorzugt|34 Bemerkungen Hi! Fragte mich, ob irgendein Rust-Designer tatsächlich auf tief verwurzeltes Land gewechselt ist.Bist du zu C/C gewechselt oder bei Rust geblieben? Mit welcher MCU hast du es zu tun? Irgendwelche Tipps? Ich habe gegenseitiges Verständnis von Rust und muss schnell den ESP32-Chip programmieren.
Erstellen Sie einen Chauffeur und eine http/tcp-API darauf.
Derzeit habe ich gemischte Botschaften über Rust in tief verwurzelten gesehen.
Die Community bewegt sich schnell, aber anscheinend bleiben alte C/C-Entwickler bei ihrer Langsamkeit.
Ich bin gespannt, was die Rust-Entwickler dazu zu sagen haben.
Ich habe das Glück, gerade erst zu einer brandneuen Gruppe gekommen zu sein, die sich mit tief verwurzeltem Rost befasst.
Hier sind ein paar meiner Takes, in keiner bestimmten Reihenfolge.
Die Sprache und die Community haben sich in sehr kurzer Zeit zu einem langen Weg entwickelt.
Es ist einfach, sicheres 'no_std' Rust in der stabilen Toolchain für 98% Ihres Codes zu verwenden, und es gibt leicht verfügbare Hundekisten für alle Beispiele wie Speicherverwaltung, Registerzugriff oder vielleicht asynchrone Laufzeiten.
Im Vergleich zu C ist Rust definitiv ein Videospiel-Wechsler in Bezug auf Zuverlässigkeit/Sicherheit/Produktivität.
Jede Zeile C-Code ist eine potenzielle Haftung, da Menschen Fehler machen.
Einen Compiler zu haben, der mich umhaut, ist wichtig; Es führt zu einem sichereren und seriöseren Programm und hilft mir, es gleich beim ersten Mal richtig zu machen.
Wie viele andere auch, ist meine Erfahrung mit Rust fast immer „wenn es zusammenpasst, funktioniert es“.
Dies ist _ besonders _ wichtig für tief verwurzelte Programme, da das Debuggen normalerweise viel schwieriger ist, wenn es um Hardware geht.
Ein wesentlicher Nachteil ist das Fehlen von Support/Engagement von Hardwarelieferanten.
Sie gehen im Grunde davon aus, dass Sie C verwenden, und alle ihre IDEs/SDKs/Codegen-Tools/was auch immer mit dieser Annahme zusammengesetzt sind.
Dies wird sich höchstwahrscheinlich nicht so schnell ändern (jemals?).
Dies bedeutet, dass Sie, wenn Sie Rust verwenden möchten, auf der Hut sein werden, um eine Menge Low-Level-Dinge wie Linker-Skripte, Boot-Serien oder Speicher-/Uhreninitialisierung herauszufinden.
Dies schlägt häufig vor, das SDK des Anbieters zu lesen oder zurückzuentwickeln, um herauszufinden, wie diese funktionieren.
Wenn Sie in einem großen Unternehmen mit einem schweren Gegenstand arbeiten, haben Sie dies möglicherweise trotzdem getan.
Für einen Enthusiasten kann dies eine erhebliche Hürde sein.
Ich habe tatsächlich einige kleine tief verwurzelte Rust-Anwendungen auf zahlreichen STM32- und RP2040-Boards durchgeführt.
Ich habe eigentlich seit 7 Jahren tief verwurzelte Entwicklung in C professionell gemacht und Rust Vollzeit für 2.5, Mix oder System und Bare Metal.
Es ist extrem schwierig, Ihr Gehirn von ein paar der typischen C/C tief verwurzelten Konzepte fester Kontextvariablen zu befreien und denken Sie an die Hardware, die sich als "eigener" Speicher anmeldet, den Sie in Rust ausführen müssen.
Die automatisch generierten HAL-Käfige sind nicht so gut, es sei denn, Sie verwenden die gängigsten wie stm32 f4 oder RP2040.
Selbst dann ist es schwierig, einen tragbaren Gadget-Chauffeur zu produzieren, ohne in die generische Hölle einzutauchen.
Alles in allem bewegt sich die Umgebung schnell, und viele meiner oben genannten Probleme sind einfach ein Teil der tief verwurzelten Rostumgebung, die im Gegensatz zu C brandneu ist.
Ich mag rtic als Struktur, und obwohl ich es tatsächlich getan habe Ich glaube, es ist der Versuch, etwas zu tun, abgesehen davon, dass es eine großartige asynchrone Laufzeit ist, es muss sich einfach auf die Laufzeit konzentrieren und nicht auf Dinge wie die Erstellung einer eigenen HAL.
Hybris und Bescheidenheit sind interessant, aber ich bin einfach nicht dazu gekommen, damit zu spielen.
Auch großartige Angebote an großartigen Tools und die Tatsache, dass die meisten Ihrer anfänglichen C/C-Debugging-Tools mit Rust-Binärdateien funktionieren, ist einfach das i-Tüpfelchen.
Ich verstehe, dass es den gesamten Ferrocene-Job gibt, aber bis das zu Ergebnissen führt, bleiben Sie bei C, wenn Sie sicherheitskritische Anwendungen durchführen, insbesondere wenn sie akkreditiert werden müssen.
Hoppla.
Es scheint, als wäre es unerwünscht, wenn Sie Hardware als Eigentum anmelden (oder riskant verwenden, um darauf zuzugreifen), wenn Sie Single-Thread-Firmware erstellen, bei der die einzige Präemption der Interrupt-Handler ist.
Ich würde sie viel lieber als eine Art von offenlegen lassen atomar, das auf Operationen beschränkt ist, die auf dieser bestimmten Hardware atomar sind.
Ich fing an, den Standort zu überprüfen, hauptsächlich armbasiert (rp2040 und STM) und ein bisschen ESP32 Tool Chain Smart:.
Die ESP32-Unterstützung ist sehr aktuell und basiert immer noch auf der C-Toolkette, was sie äußerst heikel macht (Sie können Ihre Umgebung schnell beschädigen, und es ist nie klar, wie Sie sie wiederherstellen können, außer die gesamte Toolchain von 0 neu zu kompilieren).
Arm ist ein wenig besser, da die Unterstützung nativ ist.
Die Nachbarschaft versucht, eine generische tief verwurzelte Hal-Plattform-API zu erstellen und sie für bestimmte Gadgets auszuführen.
Und es ist ziemlich schlecht: praktisch kein Papierkram, sehr wenige Beispiele, viel automatisch generierter Code, bei dem Sie in die C-Welt zurückkehren müssen, um die wirklichen Prinzipien zu verstehen.
Wenn Sie anfangen, Rust zu starten, ist es eine Explosion, es zu programmieren, und der erstellte Code ist ziemlich effektiv.
Eine kleine Aufgabe, die ich geteilt habe, um Einzelpersonen zu helfen, die mit einem Himbeer-Pi-Klon (lilygo) beginnen: https://github.com/gbin/rp2040-mandel-pico.
Ich arbeite seit 5 Jahren tief verwurzelt und frage mich, wie Rost meine größten Probleme lösen könnte: Umgang mit Entwicklungs-Setups – Ich verwende CMake, um eine einzige Anwendung für mehrere Hardwareplattformen zu erstellen.
Dies wird praktisch gezielt dadurch erreicht, dass zB eine einzige Header-Datei „ble-ncp-driver.
h“ mit mehreren „ble-ncp-driver.
cpp“ für jede Zielplattform verbunden wird.
Ich nenne dies die "Fat Chauffeur"-Methode, die sich tatsächlich als viel einfacher zu handhaben erwiesen hat als die Entwicklung einer UART-Abstraktion oder ADC-Abstraktion.
Geht das Plansystem von Rust darauf ein? Automatisiertes Gadget-Screening – Flüssigkeitslecks ähneln Fehlern in Softwareanwendungen.
Sie sind systemischer Natur und können nicht schnell durch eine feste Analyse erfasst werden.
Wir haben genauso viel Zeit in die Erhaltung eines Prüfstands investiert wie in die Produktentwicklung.
Preemptive os - mehr Schwierigkeiten, als sie verdienen.
In der Regel werden Entwickler beim Verfassen von Nachrichtenzeilen verlangsamt, um Produkte zwischen Jobkontexten weiterzugeben, und die Zeitanalyse erfordert eine gründliche Ereignisverfolgung.
Angeboten, dass ich keinen Gruppenkampf mit Speicherbesitz sehe (einfach zu tun, wenn Sie niemals, niemals malloc), was kann Rost tief verwurzelten Entwicklern noch geben? Ich habe tatsächlich entdeckt, dass Freight mehr als nur ungefähr die Aufgabe hat, Konstrukt-Setups zu handhaben, und muss nicht mit CMake-Skripten oder Makefiles herumhantieren.
Es wurde in einer anderen Bemerkung erwähnt, aber Sie können Funktionen und Hundekisten basierend auf dem Ziel, zu dem Sie sich versammeln, sperren.
Freight unterstützt ebenfalls maßgeschneiderte Entwicklungsprofile, sodass Sie ebenfalls auswählen können, was Sie möchten, auch wenn alles auf genau das gleiche Ziel abzielt.
Das Erstellen einer Ladung in Rust auf einem Cortex M ist sicher und billig – mit einer Hundekiste, die vom Rost getragen wird.
lange Designer.
Viel einfacher als die Ausführung Ihrer eigenen komplementären () Technik in einem Gedächtnis-Swimmingpool.
Ich glaube, Sie möchten rtic.
Kein vorbeugendes rtos, jedoch eine Methode, um den Kontext zwischen ISRs zu handhaben, ohne sich auf einen Modultyp oder eine internationale Variable zu verlassen, die durch zahlreiche Zugriffe beschädigt werden kann.
Extrem sehr geringer Overhead im Vergleich zu FreeRTOS.
> Umgang mit Entwicklungs-Setups ...
In Bezug auf die Planverwaltung können Sie Richtlinien dafür verwenden, aus welchen Hundeboxen Sie bestehen möchten; bestehend aus speziellen Plattformhalterungen.
nix="0.5".
Auf der Codeseite ist es praktisch wie C .
Sie haben ein Modul, das eine Benutzeroberfläche und plattformspezifische Anwendungen angibt, die abhängig von einem Makro „setup conditional check“ #[cfg(target_os="linux")] bestehen.https://github.com/tokio-rs/mio/blob/c6b5f13 adf67483 d927 b176 ...
Es ist nicht einfach Eigentum, es ist Speichersicherheit.
Ich habe tatsächlich tief verwurzelte Fortschritte gemacht und kann nicht sagen, dass ich noch nie einen Segfault gesehen habe oder noch schlimmer, ohne MMU, einfach zufällige Abstürze und fehlerhafte Gewohnheiten aufgrund von Speicherbeschädigungen.
> (einfach zu tun, wenn Sie nie, nie malloc sind) Kein tief verwurzelter Systemdesigner, also ein aufrichtiges Anliegen.
Was machst du eher von malloc? Haben Sie einen großen Bereich auf dem Stack und verwalten Sie den Speicher darin von Hand? Ich vergebe hauptsächlich feste Standorte im BSS-Bereich.
Bei dieser Methode verstehe ich zum Zeitpunkt des Zusammenbaus, dass ich mein Gedächtnis richtig benannt habe, vorausgesetzt, ich habe meinen Stack unter Kontrolle.
- keine Rekursion.
- was auch immer O( 1 ) sein muss.
Wenn ich ehrlich bin, kann ich mich nicht an eine Aufgabe erinnern, bei der ich auch nur einen Schwimmbadzuordner verwenden musste, den Sie normalerweise benötigen würden, wenn Sie versuchen würden, umsortierbare Zeilen / Listen / Bäume oder zwei zu tun.
Ich kann heute keinen entsprechenden Anwendungsfall erstellen.
Wenn Sie angeben müssen, berechnen Sie eine Reihe von Aktionen variabler Länge basierend auf einem eingehenden Paket, dann würde ich meinen Code so strukturieren, dass:.
a) nur die aktuelle Aktion und die nächste Aktion werden berechnet (so dass es keine Zeitüberschreitung zwischen der Ausführung gibt).
b) Berechnen der nächsten Aktion, wenn ich umschalte (im Allgemeinen mit einem Ping-Pong-Puffer).
c) Echtzeitinvarianten bestätigen.
Meine am häufigsten genutzte Struktur ist der Ringpuffer, um "Semi-Echtzeit"-Dinge zu zerreißen, und wenn der Ringpuffer überläuft, nun, der Ringpuffer läuft über und es muss behandelt werden.
Wenn ich mehr Speicher hätte, würde ich einfach den Ringpuffer vergrößern.
Ich bin mir nicht sicher, wie klar diese Beschreibung ist: -RRB-.
Es wird im Code selbst darauf verzichtet, es wird im Compiler-Setup durchgeführt.
Wir definieren eine Zuordnung von Speichervarianten (basierend auf der Hardware und wie wir sie verwenden möchten) und der Compiler bezeichnet Adressen für Variablen innerhalb dieser Varianten als richtig.
gcc nennt diese Dateien "Linker-Skripte", armcc "Scatter-Dateien" - das sind die Schlüsselwörter, um nach Instanzen und Papierkram zu suchen.
In harten Echtzeitsystemen, insbesondere in der Luftfahrt, ist es ziemlich üblich, malloc beim Start nur zuzulassen, wenn es überhaupt aktiviert ist.
Es gibt viele Probleme mit malloc() und insbesondere mit total free() - sie haben im Allgemeinen keine optimalen Latenzgarantien, und noch schlimmer, was passiert, wenn Sie keinen Speicher bekommen können (z.
B.
aufgrund eines Lecks oder einer schlechten Verpackung)? In zahlreichen Systemen ist dies kein Problem.
Die Vielfalt der Motoren, Klappen usw.
ändert sich zur Laufzeit nicht: --RRB-.
Wenn sie sich ändern, sind Sie im Wartungsmodus am Boden und können neu starten.
Wirklich wenig verwurzelte Systeme neigen dazu, viele temporäre Produkte auf dem Stack zu haben, und alles, was länger lebt als ein Funktionsaufruf, existiert im festen Speicher an einer reparierten Adresse.
Ganz typisch sind Memory-Schwimmbäder.
Kleine Systeme neigen dazu, eine benutzerdefinierte Belastung zu verhindern, da sie ziemlich schnell in Schwierigkeiten geraten können.
Funktionsvariablen, deren Geltungsbereich und Lebensdauer auf den Aufruf beschränkt sind, werden wie gewohnt auf den Stack gelegt.
Alles andere – dh Konstanten, feste Funktionsvariablen und alles mit größerem Gültigkeitsbereich – wird zur Assemblierungszeit als eigener Speicher bezeichnet.
Wir haben keine Ladung.
Wir verwenden keine Bereiche variabler Länge oder andere lebendigere Informationsstrukturen.
Alles, was wachsen und abnehmen muss, tut dies innerhalb seines eigenen Puffers mit fester Länge.
C/C tief verwurzelter Designer hier.
Ich habe Rust nie tief verwurzelt verwendet, da ich die Notwendigkeit nicht wirklich gesehen habe.
Ich mache derzeit einen Rückzug und fing an, mit tief verwurzeltem Rust zu spielen.
Bei der Arbeit hatte ich die gleiche Position wie Sie und drängte darauf, Rust in unsere Umgebung aufzunehmen (um zu verhindern, dass das, was 100% C / Python war, fragmentiert wurde):.
- Speicherbesitzfehler sind kein Problem (und sogar auf dem Host, mit unique_ptr und shared_ptr können Sie wirklich ziemlich weit kommen).
- C-Meta-Programme sind eigentlich eher sinnvoll, um die meisten Bugs im Keim zu ersticken (State, Komponieren auf den falschen Port, inkl.
i16 auf i32, oder inkl.
ms zu uns).
- C-Meta-Shows sind respektabel bei der Entwicklung größerer Abstraktionen, wie z.
B.
monadische Jobs.
Hier sind die Hauptvorteile, die ich sehe und die mich davon überzeugt haben, es ernst zu nehmen.
- Fracht für Planmanagement und Struktur.
Es ist außergewöhnlich einfach und "großartig", Pläne einzubinden, zahlreiche Setups zu handhaben, zusätzliche Tools als Teil der Struktur zu entwickeln, sie jedoch auf dem Host auszuführen (Status, einen Prozedur-Parser-Generator usw.).
Das ist einfach groß.
Ich habe im Grunde fast nie einen anderen Code wiederverwendet als das Kopieren und Einfügen von Quellcode aus anderen Jobs oder aus der Lieferantenbibliothek direkt in den Job, da alles andere einfach zu anfällig war, selbst mit CMake.
Viele tief verwurzelte Aufgaben, mit denen ich mich befasste, hatten ihr eigenes unverwechselbares Entwicklungssystem, das auf make basierte, und Sie mussten es jedes Mal neu lernen.
- Makros, die sich tatsächlich lohnen.
Das ist vielleicht das Erstaunlichste.
Normalerweise verwende ich Muster wie Zustandsgeräte und andere Formalismen, aber das Beste, was ich in C tun kann, um sie großartig zum Komponieren zu machen, ist, einige zu mischen schreckliche Makros mit einigen Vorlagen, und es endet ständig in einem Durcheinander in den Fehlermeldungen.
Rust bietet Ihnen wirklich gute "Lisp"-y-Metaprogrammierung.
- Rust funktioniert ähnlich gut für das Bare Metal und das Scripting auf höchstem Niveau.
Das bedeutet, dass meine Aufgaben nicht zu einer Mischung aus CMake Celebration Python C werden, ich kann alles in Rust machen.
- Der tief verwurzelte Code mit einem abstrahierten HAL sieht wirklich großartig aus.
Es ist fast Arduino-ähnlich, abgesehen davon, dass dies wirklich das Original ist.
Folgendes haben mein Pairing-Partner und ich entwickelt, um einen SPI-Bildschirm zu verwalten:.
fn brand-new(.
spim: spim:: Spim,.
timer: &' a mut hal:: Timer,.
cs: gpio:: Pin,.
rst: gpio:: Pin,.
dc: gpio:: Pin,.
hectic: gpio:: Pin,.
) -> Show Freight hat erst kürzlich Multi-Target-Builds bekommen, was grandios ist und auf diese Weise weniger Kopfschmerzen bereitet.
Beschreibst du Freights instabile "bindeps"-Funktion? Ich frage, weil mein Unternehmen diese Arbeit gesponsert hat, und für die Funktionen zur letztendlichen Unterstützung dieser Funktion, die wir eigentlich gerne von Benutzern erhalten möchten, die sie verwenden.:-RRB-.
Ich bin kein reiner Rust-Designer, aber ein einfacher Systementwickler, und mein Einstieg in die tief verwurzelte Technik beschränkt sich auf einen Nebenjob (siehe mein Profil), aber nein, ich habe nicht zu C/C gewechselt .
Rust bringt übermäßige Güte, um es bereitzustellen.
Rust-embedded ist eine einfache Umgebung, mit der man umgehen kann (wenn es unausgereift ist), und wenn Sie mehr Vielseitigkeit wünschen, versucht Tock OS [0] diesen Bereich abzudecken (ebenfalls unausgereift, aber ich beschäftige mich damit).
[0] https://www.tockos.org/.
Das habe ich gefühlt.
Behandelt, um einen einfachen Job zu erstellen, bei dem die MCU eine Verbindung zu WiFi herstellt, sich im Netzwerk (mDNS) zeigt und mir eine TCP-API zum Ein- und Ausschalten der LED bereitstellt.
Ich habe ESP32-S3 verwendet.
Die Fähigkeit, sexuell übertragbare Krankheiten und ihre Rostprodukte zu nutzen, machte es sehr einfach.
Obwohl der Großteil ihrer Rostprodukte einfach Hüllen um C sind.
Kein Rust-Entwickler, aber ich mag die Sprache.
Ich habe tatsächlich tief verwurzelt in den letzten paar Jahren entdeckt.
Früher mochte ich C nicht und verhinderte es wie das Leiden.
An einem großartigen Tag genieße ich es jetzt irgendwie, auf eine krank perverse verdrehte Art und Weise.
Ich würde sagen, dass der tief verwurzelte Bereich im Grunde eher projektorientiert ist, daher sind brandneue Stacks nicht so ein großer Nachteil wie im Backend-Bereich am unteren Ende der Jobkomplexität und des regulativen Ingress-Spektrums.
Sie werden Lücken in Bezug auf die Zugänglichkeit und den Reifegrad von Gadget-Chauffeuren und das Kombinationsniveau mit Toolkits von Siliziumlieferanten sehen.
In Anbetracht dessen, dass die meisten Aufgaben nicht zu viel einzigartige Hardware verwenden, die ein oder zwei I2C- oder SPI-Autofahrer nicht dauerhaft in Anspruch nimmt, sind Sie höchstwahrscheinlich in Ordnung, um Rust zu gehen.
Vernünftigerweise werden Sie bei komplizierten Dingen Wand um Wand treffen, was Zeit und Geld kostet.
Wenn Sie C/C und Rust in einer Binärdatei mischen oder einen gottähnlichen Autofahrer-Ausführungsstatus erreichen können, werden Sie ziemlich problemlos sein, während ich dafür sorge, dass dies möglich ist, sobald Sie an dem Punkt angelangt sind, an dem Sie den gesamten Stapel zusammenstellen Möglicherweise ist es am besten, nach einer Aufgabe bei einem Siliziumlieferanten zu suchen, der sein Toolkit für Rust-Unterstützung aktualisiert, wenn man bedenkt, dass die Basisbibliothek und die Codegenerierung dazu beitragen, mehr Artikel als ein Geschäft zu bewegen.
Versuchen Sie, an die Personalabteilung von TI/NXP/Renesas/STM/Freescale/Microchip/NXP/Atmel zu schreiben und Umfang anzufordern: Ich wäre schockiert, wenn Sie kein Interesse hätten.