Máquinas de estado de programação incorporadas


8

Estou pensando em implementar uma máquina de estado finito não trivial (especificada como um gráfico hierárquico UML) em um MCU de 32 bits com gcc.

Existem regras práticas que funcionam melhor e o que funciona menos bem? Meu instinto diz que uma implementação baseada em comutador (ou mesmo computada) deve ter um desempenho ligeiramente superior, enquanto uma tabela de transição baseada em ponteiro de função geralmente tem a reputação de ser mais sustentável.

Além disso: alguém avaliou o Boost MSM para aplicativos incorporados? Eu sei que o Boost MSM é geralmente elogiado por ser muito eficiente, mas para aplicativos incorporados a eficiência pode ser medida de maneira diferente da do mundo da programação de PC.

Alguém sabe como é o mecanismo compilado da máquina de estado do MSM? Mais como uma opção de jumptable ou mais como uma tabela de transição de ponteiro de função? Ele usa alocação dinâmica de memória ou pode ser usado estaticamente?


Eu ficaria longe do Boost MSM (e modelos C ++ em geral), pois eles aumentavam o tamanho do código muito rápido.
JMS

Existem algumas outras pegadinhas em C ++ para estar ciente de ...
Matt Young

@jms É como dizer que um lenhador deve ficar longe de ferramentas afiadas e usar um martelo, porque com ferramentas afiadas ele pode se cortar. Os modelos são uma ferramenta afiada, que - quando usada da maneira correta - pode aumentar a velocidade e reduzir o tamanho do seu código, especialmente para pequenos microcontroladores. Quando usada da maneira errada - bem, qualquer ferramenta pode ser usada da maneira errada!
Wouter van Ooijen

Respostas:


8

Eu ficaria surpreso se houver uma grande diferença em um MCU de 32 bits. Evitar ramificações condicionais pode economizar alguns ciclos, mas você realmente terá êxito ou falhará com base em alguns ciclos? O número de estados de espera na sua RAM e ROM provavelmente é pelo menos tão importante. O mesmo acontece com o conjunto de instruções da CPU.

Otimização prematura é a raiz de todo o mal. Comece com o que é mais fácil de implementar e manter e otimize apenas quando necessário com base em perfis.


Eu esperaria que a influência no desempenho de uma estrutura de máquina de estado (DIY ou de alguma biblioteca) - em oposição às ações - seja muito pequena. Então, como Adam diz: primeiro codifique para facilitar a leitura. Um segundo. E terceiro. (. A na posição 10: perfil de optimização local é muito abaixo do que.)
Wouter van Ooijen

3

Para uma implementação UML no incorporado, dê uma olhada na estrutura QP -> http://www.state-machine.com . As variantes C e C ++ estão disponíveis. A GUI que acompanha (QM) até permite codificar usando a notação UML. A estrutura é pequena o suficiente para rodar no Arduino; 32 bits são fáceis.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.