Machines à états de programmation intégrées

8

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?

ARF
la source
Je resterais loin des Boost MSM (et des modèles C ++ en général) car ils font exploser la taille du code très rapidement.
jms
Il y a quelques autres problèmes en C ++ à connaître ...
Matt Young
@jms C'est comme dire qu'un bûcheron devrait rester à l'écart des outils tranchants et utiliser un marteau à la place, car avec des outils tranchants, il pourrait se couper. Les modèles sont un outil pointu qui, lorsqu'il est utilisé correctement, peut augmenter la vitesse et réduire la taille de votre code, en particulier pour les petits microcontrôleurs. Lorsqu'il est utilisé de la mauvaise manière - eh bien, tout outil peut être utilisé de la mauvaise façon!
Wouter van Ooijen

Réponses:

8

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.

Adam Haun
la source
Je m'attendrais à ce que l'influence sur les performances d'un cadre de machine d'état (qu'il soit bricolage ou provenant d'une bibliothèque) - par opposition aux actions - est très faible. Donc, comme le dit Adam: codez d'abord la lisibilité. Une seconde. Et troisièmement. (A à la 10ème position: profil. L'optimisation locale est bien en dessous.)
Wouter van Ooijen
3

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.

Oleg Mazurov
la source