Eingebettete Programmierzustandsmaschinen

8

Ich möchte eine nicht triviale endliche Zustandsmaschine (angegeben als hierarchisches UML-Zustandsdiagramm) auf einer 32-Bit-MCU mit gcc implementieren.

Gibt es Faustregeln, was besser und was weniger gut funktioniert? Meiner Meinung nach sollte eine switchbasierte (oder sogar berechnete goto) Implementierung etwas leistungsfähiger sein, während eine funktionszeigerbasierte Übergangstabelle im Allgemeinen als wartbarer angesehen wird.

Außerdem: Hat jemand Boost MSM für eingebettete Anwendungen evaluiert ? Ich weiß, dass Boost MSM allgemein als sehr effizient gelobt wird, aber für eingebettete Anwendungen kann die Effizienz anders gemessen werden als in der Welt der PC-Programmierung.

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

ARF
quelle
Ich würde mich von Boost MSM (und C ++ - Vorlagen im Allgemeinen) fernhalten, da diese die Codegröße sehr schnell in die Luft jagen.
JMS
Es gibt einige andere Fallstricke in C ++, die Sie beachten sollten ...
Matt Young
@jms Das heißt, ein Holzfäller sollte sich von scharfen Werkzeugen fernhalten und stattdessen einen Hammer verwenden, da er sich mit scharfen Werkzeugen möglicherweise selbst schneiden könnte. Vorlagen sind ein scharfes Werkzeug, das bei richtiger Verwendung die Geschwindigkeit erhöhen und die Größe Ihres Codes verringern kann, insbesondere bei kleinen Mikrocontrollern. Bei falscher Verwendung - nun, jedes Werkzeug kann falsch verwendet werden!
Wouter van Ooijen

Antworten:

8

Es würde mich wundern, wenn es bei einer 32-Bit-MCU einen großen Unterschied gibt. Das Vermeiden von bedingten Verzweigungen könnte Ihnen einige Zyklen ersparen, aber werden Sie aufgrund einiger Zyklen wirklich erfolgreich sein oder scheitern? Die Anzahl der Wartezustände in Ihrem RAM und ROM ist wahrscheinlich mindestens genauso wichtig. So ist 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 bei Bedarf basierend auf der Profilerstellung.

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

Eine UML-Implementierung für Embedded finden Sie im QP-Framework -> http://www.state-machine.com . Es sind sowohl C- als auch C ++ - Varianten verfügbar. Die zugehörige GUI (QM) ermöglicht sogar das Codieren in UML-Notation. Das Framework ist klein genug, um auf Arduino ausgeführt zu werden. 32-Bitter sind einfach.

Oleg Mazurov
quelle