A máquina de estado é um algoritmo muito útil na programação profissional.
Particularmente gosto muito de programar utilizando esta técnica devido a facilidade de realizar saltos e fazer com que o processador realize várias tarefas quase que ao mesmo tempo.
Para construir este algoritmo, são necessários três componentes principais:
Variável de controle – por ela que a máquina é controlada e seus estados selecionados
Laço de repetição – dá a vida, roda o processo
Seletor – determina qual tarefa será executada, baseado na variável de controle
Uma máquina de estado escrita em linguagem C tem a construção do trecho de código abaixo.
Este exemplo realiza as seguintes tarefas:
A variável de controle – mstate – é iniciada com zero;
O estado zero executa a função “AcoesDoEstadoZero ()” e avança a máquina para o estado 1;
No estado 1 acontece “AcoesDoEstadoUm ();” e um operador condicional if decide através da variável “avanco” se a máquina irá para o estado 2 ou retornará para o estado zero;
O estado 2 executa “AcoesDoEstadoDois ();” e retorna a máquina para o estado zero e
É de boa prática todo switch ter seu default até onde aparentemente ele não tem utilidade. Na máquina de estado funciona como um estado especial para manipular algum erro de programação ou até algum desvio emergencial ou situação especial do programa.
int mstate = 0; // variável de controle
while (1) // laço eterno
{
switch (mstate) // seletor
{
case 0: // estado 0
AcoesDoEstadoZero ();
mstate = 1;
break;
case 1: // estado 1
AcoesDoEstadoUm ();
if (avanco == 1)
mstate = 2;
else
mstate = 0;
break;
case 2: // estado 2
AcoesDoEstadoDois ();
mstate = 0
break;
default: // erro
AcoesEmCasoDeErro ();
mstate = 0;
break;
}
}
Um programa utilizando máquina de estado pode ser estruturado de forma que ações instantâneas ocorram quase que imediatamente, independente da posição onde se encontra o algoritmo. Isso é particularmente muito útil quando se programa microcontroladores.
A seguir, um exemplo comentado que ilustra este conceito. Ele não é funcional, apenas mostra os detalhes do assunto. Para um programa prático, veja o exemplo no final desta página.
Veja que aqui é possível executar algumas tarefas além da máquina de estado:
ações iniciais – como por exemplo iniciar as portas e a entrada analógica
ações permanentes – leitura do teclado, botão de parada de emergência
ações finais – quando for o caso, geralmente só existem quando se programa para PC, não faz sentido ter tarefas de encerramento de um programa que roda eternamente em um microcontrolador.
void main (void)
{
int mstate = 0; // esta é a variável de controle da máquina
AcoesIniciais (); // aqui são executadas rotinas de pré-configuração
while (1) // o laço eterno da máquina
{
AcoesPermanentes (); // nesta posicao são tratadas as tarefas essenciais
switch (mstate) // seletor da máquina
{
case 0: // estado 0
AcoesDoEstadoZero ();
mstate = 1;
break;
case 1: // estado 1
AcoesDoEstadoUm ();
mstate = 2
break;
case 2: // estado 2
AcoesDoEstadoDois ();
mstate = 0
break;
default: // erro
AcoesEmCasoDeErro ();
mstate = 0;
break;
}
}
AcoesFinais (); // quando for o caso, geralmente não existem em um microcontrolador
}
Este programa foi escrito e compilado no Borland C++ versão 3.1. Trata-se de um semáforo na tela com duas ruas e passagem de pedestre. A barra de espaço ativa o pedestre e a tecla 'p' o amarelo piscante. Para sair do piscante, pressione a tecla novamente.
Para baixar:
Código fonte: sem-tela.cpp e sem-tela.h
Executável: sem-tela.exe
Em eterna construção