Estoy buscando implementar una máquina de estado finito no trivial (especificada como un diagrama de estado jerárquico UML) en una MCU de 32 bits con gcc.
¿Existen reglas generales que funcionen mejor y que funcionen menos? Mi instinto dice que una implementación basada en conmutadores (o incluso computada) debería ser ligeramente más eficiente, mientras que una tabla de transición basada en punteros de función generalmente tiene la reputación de ser más fácil de mantener.
Además: ¿alguien ha evaluado Boost MSM para aplicaciones integradas? Sé que Boost MSM generalmente se elogia por ser muy eficiente, pero para las aplicaciones integradas, la eficiencia puede medirse de manera diferente que en el mundo de la programación de PC.
¿Alguien sabe cómo se ve el motor de máquina de estado compilado de MSM? ¿Más como una tabla de salto de interruptor o más como una tabla de transición de puntero de función? ¿Utiliza asignación de memoria dinámica o puede usarse estáticamente?
Respuestas:
Me sorprendería si hay una gran diferencia en un MCU de 32 bits. Evitar las ramas condicionales podría ahorrarle algunos ciclos, pero ¿realmente va a tener éxito o fracasar en función de unos pocos ciclos? El número de estados de espera en su RAM y ROM es probablemente al menos igual de importante. Así es el conjunto de instrucciones de la CPU.
La optimización prematura es la fuente de todos los males. Comience con lo que es más fácil de implementar y mantener, y solo optimice cuando sea necesario en función de la creación de perfiles.
fuente
Para una implementación UML en embebido, eche un vistazo a QP framework -> http://www.state-machine.com . Ambas variantes C y C ++ están disponibles. La GUI acompañante (QM) incluso permite codificar usando notación UML. El marco es lo suficientemente pequeño como para ejecutarse en Arduino; 32-bitters son fáciles.
fuente