Я смотрю на реализацию нетривиального конечного автомата (заданного как иерархическая диаграмма состояний UML) на 32-битном MCU с gcc.
Существуют ли практические правила, что работает лучше, а что - хуже? Моя интуиция говорит, что основанная на переключателе (или даже вычисленная goto) реализация должна быть немного более производительной, в то время как таблица переходов на основе указателя функции обычно считается более обслуживаемой.
Также: кто-нибудь оценивал Boost MSM для встроенных приложений? Я знаю, что Boost MSM обычно оценивается как очень эффективный, но для встроенных приложений эффективность может быть измерена иначе, чем в мире программирования на ПК.
Кто-нибудь знает, как выглядит скомпилированный конечный автомат MSM? Больше похоже на таблицу переключателей или больше на таблицу переходов указателя функции? Использует ли он динамическое распределение памяти или может использоваться статически?
Ответы:
Я был бы удивлен, если есть большая разница на 32-битном MCU. Избежание условных переходов может сэкономить вам несколько циклов, но действительно ли вы добьетесь успеха или потерпите неудачу на основе нескольких циклов? Количество состояний ожидания в вашей оперативной памяти и ПЗУ, вероятно, по крайней мере так же важно. Так же и набор команд процессора.
Преждевременная оптимизация - корень всего зла. Начните с того, что проще в реализации и обслуживании, и оптимизируйте его только в случае необходимости на основе профилирования.
источник
Для одной реализации UML на встраиваемом взгляните на QP framework -> http://www.state-machine.com . Оба варианта C и C ++ доступны. Сопровождающий GUI (QM) даже позволяет кодировать, используя нотацию UML. Фреймворк достаточно мал, чтобы работать на Arduino; 32-битные легко.
источник