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?
Antworten:
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.
quelle
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.
quelle