Página do Brat


Máquina de estado



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.

Componentes

Formato

Estruturação de um programa

Exemplo: um semáforo

Principais componentes

Para construir este algoritmo, são necessários três componentes principais:

Formato básico

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:

  1. A variável de controle – mstate – é iniciada com zero;

  2. O estado zero executa a função “AcoesDoEstadoZero ()” e avança a máquina para o estado 1;

  3. 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;

  4. O estado 2 executa “AcoesDoEstadoDois ();” e retorna a máquina para o estado zero e

  5. É 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;

}

}

Estrutura de um programa

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:



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

}



Programa exemplo: semáforo

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