Async Rust vs. C RTOS: Ein Embedded-Showdown

Embedded Rust RTOS vs. C RTOS

Async Rust vs. C RTOS: Ein Embedded-Showdown

In diesem technischen Blogbeitrag vergleichen wir Embassy (async Rust) mit FreeRTOS (C) auf einem STM32F446-Mikrocontroller. Beide Implementierungen führen dieselben Aufgaben aus: LED blinken, Button-Interrupts verarbeiten und Nachrichten über eine Queue senden. Gemessen werden Interrupt-Latenz, Programmgröße, RAM-Nutzung und Programmierbarkeit. Der Autor erwartet, dass das RTOS bei Latenz und Speicher besser abschneidet, während Rust bei statischem Speicher und Komfort punkten könnte. Die Ergebnisse werden anhand von Oszilloskop-Messungen und Compiler-Reports präsentiert.

Ich bin voreingenommen, aber ich hoffe, dass dieser Blogbeitrag einen fairen Vergleich liefert.
  1. Animats

    Das ist bei sehr geringer CPU-Last. Ein Async-Ansatz ohne Preemption kann also funktionieren. Wenn nennenswerte Berechnungen anstehen, funktioniert er nicht so gut.

    Eine nützliche Zahl, die man auf einem Oszilloskop messen sollte, ist die Interrupt-Latenz im schlechtesten Fall. Das ist entscheidend, wenn es eine harte Echtzeitbedingung gibt. Sie haben die Standardabweichung gemessen, aber nicht den schlechtesten Fall. Der übliche Testaufbau ist: Ein Eingangssignal (typischerweise eine Rechteckwelle) geht an einen Eingangspin, der Interrupt wird ausgelöst, wenn Interrupts nicht verhindert werden, die Aufgabe startet, die Aufgabe schaltet einen Ausgangspin ein. Man beobachtet die Verzögerung von Eingang zu Ausgang auf dem Oszilloskop und sucht nach Ausreißern.

    Wenn man vollständig run-to-completion arbeitet, werden die Ausreißer durch die längste Berechnungsaufgabe bestimmt. Das ist ein Problem, wenn es eine solche Aufgabe gibt.

    Historisch gesehen ist das der Punkt, an dem QNX glänzt. Der Interrupt wird verarbeitet und plant einen Thread. Auf Interrupt-Ebene passiert im Wesentlichen nur die Thread-Aktivierung. Der Thread schaltet den Ausgangspin ein. Man kann auf dem Oszilloskop nach Planungs-Ausreißern suchen. Die Latenz im besten Fall ist höher, als wenn man die Arbeit auf Interrupt-Ebene erledigt, aber die Latenz im schlechtesten Fall ist konstant, selbst wenn Threads mit niedrigerer Priorität rechenintensiv sind.

    Das ist der Unterschied zwischen Echtzeit- und "Beinahe-Echtzeit"-Scheduling.

  2. CupricTea

    Der Titel sollte geändert werden. Async Rust != RTOS. RTOS sind präemptiv multithreaded, während async kooperativ mit Ausstiegspunkten arbeitet.

    Vielleicht "Eingebettetes async Rust vs. C-RTOS".

  3. bfrog

    Inzwischen scheint nichts anderes mehr wirklich wichtig zu sein als Zephyr, das fast Linux-ähnliche Fluchtgeschwindigkeit erreicht hat. Jeder Hersteller auf der Welt unterstützt es jetzt, und diese Leute folgen dem Geld.

    Rust scheint an manchen Stellen bescheidene Unterstützung zu haben.

    Mit KI weiß ich nicht, ob Sprache überhaupt noch eine Rolle spielt.

  4. joshchngs

    Dieser Artikel ist inzwischen fast 5 Jahre alt, was ihn in Embedded-Rust-Begriffen ziemlich alt macht. Ich denke, die allgemeine Landschaft hat sich nicht allzu sehr verändert, aber ich wäre vorsichtig, mich auf irgendwelche Details daraus zu verlassen.

  5. aw1621107

    (2022)

Mehr von diesem Tag

2026-09-02