Je cherche à implémenter une machine à états finis non triviale (spécifiée comme un organigramme hiérarchique UML) sur un MCU 32 bits avec gcc.
Existe-t-il des règles générales qui fonctionnent mieux et qui fonctionnent moins bien? Mon instinct dit qu'une implémentation basée sur un commutateur (ou même un goto calculé) devrait être légèrement plus performante alors qu'une table de transition basée sur un pointeur de fonction est généralement réputée être plus maintenable.
Aussi: quelqu'un a-t-il évalué Boost MSM pour les applications intégrées? Je sais que Boost MSM est généralement considéré comme très efficace, mais pour les applications intégrées, l'efficacité peut être mesurée différemment que dans le monde de la programmation PC.
Quelqu'un sait-il à quoi ressemble le moteur de machine d'état compilé de MSM? Plus comme un interrupteur commutable ou plus comme une table de transition de pointeur de fonction? Utilise-t-il l'allocation dynamique de mémoire ou peut-il être utilisé statiquement?
Réponses:
Je serais surpris s'il y avait une grande différence sur un MCU 32 bits. Éviter les branches conditionnelles pourrait vous faire économiser quelques cycles, mais allez-vous vraiment réussir ou échouer sur la base de quelques cycles? Le nombre d'états d'attente sur votre RAM et ROM est probablement au moins aussi important. Il en va de même du jeu d'instructions du processeur.
L'optimisation prématurée est la racine de tout Mal. Commencez par ce qui est plus facile à implémenter et à maintenir, et optimisez uniquement lorsque cela est nécessaire en fonction du profilage.
la source
Pour une implémentation UML sur embarqué, jetez un œil au framework QP -> http://www.state-machine.com . Les variantes C et C ++ sont disponibles. L'interface graphique (QM) qui l'accompagne permet même de coder en utilisant la notation UML. Le cadre est assez petit pour fonctionner sur Arduino; 32 amers sont faciles.
la source