Função switch e a máquina de estado – state machine

porRicardo Jorge

Função switch e a máquina de estado – state machine

A função switch, associada a máquina de estado ( state machine ), simplifica o código e facilita a manutenção, substituindo os vários “IF” aninhados, também conhecido como cascata de “IF”.

Não raro durante o desenvolvimento de um código, é necessário tomar decisões sobre vários eventos para que o fluxo prossiga na direção correta.

A máquina de estado também é conhecida como :

  • finite-state machine (FSM)
  • finite-state automaton (FSA)
  • autômato finito

Porque utilizar a máquina de estado?

Implementar código usando uma máquina de estado é uma técnica de design extremamente útil para resolver problemas complexos de engenharia.

As máquinas de estado dividem o projeto em uma série de etapas, ou o que é chamado de estados no jargão da máquina de estado.

Cada estado executa alguma tarefa estritamente definida.

Os eventos, por outro lado, são os estímulos que fazem com que a máquina de estado se mova, ou transite, entre estados.

Como a máquina de estado opera?

Cada máquina de estado tem o conceito de “estado atual”.

Este é o estado que a máquina de estado ocupa naquele momento.

Em qualquer momento, a máquina de estado pode estar em apenas um único estado.

Cada instância de um estado particular da máquina de estado, pode redefinir o estado inicial, ou o próximo estado.

Entretanto, o estado inicial não é executado imediatamente pela máquina de estado, quando o programa for iniciado.

Somente após receber um evento, a máquina de estado executa uma função que estava associada ao evento.

Desta forma, as várias etapas, ou estados, são executados quando cada evento é recebido e avaliado pela máquina de estado.

Devido a forma de operar da função switch, ela é perfeita para navegação entre os estados de uma máquina de estado.

Imagine criar uma máquina de estado, utilizando “IF” !

Em relação ao uso de “IF”, as principais vantagens da função switch são :

  • Código legível
  • Facilidade de manutenção
  • Facilidade de alteração : inclusão / remoção de opções ( estados )
  • Rapidez na seleção do trecho de código a ser executado

Função switch e a máquina de estado

Abaixo temos um exemplo real da aplicação da função switch usada para determinar a frequência da rede AC.

Posteriormente este código será comentado com mais detalhes, no artigo referente ao Monitor AC.

//
// Calculate frequency
//

  if(freqEnabled)
  {
    freqSampleVAC = sampleVAC - 512;
    switch(freqSM) {
      case 1:
        if(freqSampleVAC < 0) {              // wait for zero to start counting cycles
          freqSM = 2;
        }
      break;
      case 2:
        if(freqSampleVAC >= 0)               // wait for positive cycle
        {
          freqStartTime = micros(); 
          freqSM = 3;
        }
      break;
      case 3:
        if(freqSampleVAC < 0 )               // wait for zero crossing
        {
          freqSM = 4;
        }  
      break;
      case 4:
        if(freqSampleVAC >=0 )                // one cycle is completed
        {
          freqSample++;                   // count number of cycles and wait for another one
          freqSM = 3;
        }
      break;
    }
  
        if(freqSample == ACFreq)          
        {
            acFrequency = 1000000 / ((float)(micros() - freqStartTime) / freqSample);
            freqSample = 0;
            freqSM = 1;
            freqEnabled = false;           // now frequency info can be used
            freq_activity = !freq_activity;
        }
    }


Referência :

Finite-state machine

State Machine Design in C

Artigos relacionados :

arduino – como melhorar a precisão da entrada analógica

Linguagem C dicas sobre programação

IoT – protocolo MQTT – introdução



Image by Arek Socha from Pixabay

Sobre o Autor

Ricardo Jorge administrator

Deixe uma resposta