Eingebettete Programmierzustandsmaschinen

Ich betrachte die Implementierung einer nicht trivialen endlichen Zustandsmaschine (spezifiziert als hierarchisches UML-Zustandsdiagramm) auf einer 32-Bit-MCU mit gcc.

Gibt es Faustregeln, was besser und was weniger gut funktioniert? Mein Bauchgefühl sagt, dass eine Switch-basierte (oder sogar berechnete Goto) Implementierung etwas performanter sein sollte, während eine auf Funktionszeigern basierende Übergangstabelle allgemein als wartungsfreundlicher gilt.

Außerdem: Hat jemand Boost MSM für eingebettete Anwendungen evaluiert? Ich weiß, dass Boost MSM allgemein als sehr effizient gepriesen wird, aber bei eingebetteten Anwendungen wird Effizienz möglicherweise anders gemessen als in der Welt der PC-Programmierung.

Weiß jemand, wie die kompilierte Zustandsmaschinen-Engine von MSM aussieht? Eher wie eine Switch-Sprungtabelle oder eher wie eine Funktionszeiger-Übergangstabelle? Verwendet es dynamische Speicherzuordnung oder kann es statisch verwendet werden?

Ich würde mich von Boost MSM (und C++-Vorlagen im Allgemeinen) fernhalten, da sie die Codegröße sehr schnell in die Luft jagen.
Es gibt einige andere Fallstricke in C++, die Sie beachten sollten ...
@jms Das ist, als würde man sagen, dass ein Holzfäller sich von scharfen Werkzeugen fernhalten und stattdessen einen Hammer verwenden sollte, weil er sich mit scharfen Werkzeugen schneiden könnte. Templates sind ein scharfes Werkzeug, das - wenn es richtig eingesetzt wird - die Geschwindigkeit erhöhen und die Größe Ihres Codes reduzieren kann, insbesondere für kleine Mikrocontroller. Bei falscher Anwendung - nun, jedes Werkzeug kann falsch verwendet werden!

Antworten (2)

Ich wäre überrascht, wenn es auf einer 32-Bit-MCU einen großen Unterschied gibt. Das Vermeiden bedingter Verzweigungen könnte Ihnen einige Zyklen ersparen, aber werden Sie wirklich erfolgreich sein oder scheitern, basierend auf ein paar Zyklen? Die Anzahl der Wartezustände in Ihrem RAM und ROM ist wahrscheinlich mindestens genauso wichtig. Ebenso der CPU-Befehlssatz.

Vorzeitige Optimierung ist die Wurzel allen Übels. Beginnen Sie mit dem, was einfacher zu implementieren und zu warten ist, und optimieren Sie nur dort, wo es notwendig ist, basierend auf Profiling.

Ich würde erwarten, dass der Einfluss auf die Leistung eines Zustandsmaschinen-Frameworks (ob DIY oder aus einer Bibliothek) - im Gegensatz zu den Aktionen - sehr gering ist. Also, wie Adam sagt: Code zuerst für die Lesbarkeit. Eine Sekunde. Und drittens. (A an 10. Stelle: Profil. Lokale Optimierung liegt weit darunter.)

Für eine UML-Implementierung auf Embedded werfen Sie einen Blick auf QP Framework -> http://www.state-machine.com . Es sind sowohl C- als auch C++-Varianten verfügbar. Die begleitende GUI (QM) erlaubt sogar die Codierung in UML-Notation. Das Framework ist klein genug, um auf Arduino zu laufen; 32-Bitter sind einfach.