Introducción A Las Máquinas de Estado Finito

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 10

Introduccin a las Mquinas de

Estado Finito
Escrito por Ral Alvarez.

Si ya haz realizado proyectos con


microcontroladores en el pasado, pero nunca haz usado Mquinas de Estado Finito
y tampoco ests seguro de lo que son, posiblemente te falta dar el siguiente "salto'
que te acerque a un estilo ms profesional en la programacin de
microcontroladores y/o microprocesadores a travs del uso de herramientas y
paradigmas ms sofisticados como, en este caso, las Mquinas de Estado Finito.
No es de extraar que muchos desarrolladores profesionales de sistemas
embebidos de talla mundial, no solamente usen regularmente este estilo de
programacin, sino que recomienden enfticamente su uso en cualquier proyecto
que se preste a ello (la mayora de los sistemas reactivos de pequea y mediana
escala, por ejemplo). Lo que s sorprende es que muchos estudiantes y egresados
de la carrera de electrnica u otras carreras afines al diseo embebido no han
aprendido a usar este patrn de programacin en el desarrollo de sistemas
embebidos. En este artculo le damos un vistazo introductorio a este tema.

Que es una Mquina de Estado Finito?


Una Mquina de Estado Finito (Finite State Machine), llamada tambin Autmata
Finito es una abstraccin computacional que describe el comportamiento de un
sistema reactivo mediante un nmero determinado de Estados y un nmero
determinado de Transiciones entre dicho Estados.
Las Transiciones de un estado a otro se generan en respuesta a eventos de entrada
externos e internos; a su vez estas transiciones y/o subsecuentes estados pueden
generar otros eventos de salida. Esta dependencia de las acciones (respuesta) del
sistema a los eventos de entrada hace que las Mquinas de Estado Finito (MEF)
sean una herramienta adecuada para el diseo de Sistemas Reactivos y la
Programacin Conducida por Eventos (Event Driven Programming), cual es el caso
de la mayora de los sistemas embebidos basados en microcontroladores o
microprocesadores.

Las MEF se describen grficamente mediante los llamados Diagramas de Estado


Finito (DEF), llamados tambin Diagramas de Transicin de Estados.

Sistemas Reactivos
Un Sistema Reactivo es aquel que interacta constantemente con su medio ambiente, tiene
la caracterstica de ser conducido por eventos (event driven), la respuesta de tiempo es
crtica y una vez que el sistema se activa permanece en ese estado de manera indefinida.
En estos sistemas los eventos llegan en tiempos impredecibles y el sistema debe tener la
capacidad de responder de manera inmediata, en el orden de los milisegundos o
microsegundos, sobre todo en sistemas donde la seguridad es crtica (ejemplo: un piloto
automtico en un avin o una mquina para soporte de vida en un hospital).
La gran mayora de los sistemas embebidos (en base a microcontroladores o
microprocesadores) corresponden a esta categora, debido a que estos sistemas estn
tpicamente conectados a varios tipos de sensores y transductores de entrada encargados
de captar los estmulos del medio ambiente (temperatura, presin, luz, magnetismo,
fuerza / peso, etc.), procesar dicha informacin y generar una respuesta del sistema hacia
el medio ambiente a travs de transductores de salida y actuadores.
Sistemas Transformacionales
A diferencia de los Sistemas Reactivos un Sistema Transformacional es aquel que recibe
cierta informacin de entrada, realiza una cierta cantidad de cmputo, produce cierta
informacin de salida y luego termina. No muchos sistemas embebidos caen en esta
categora; ejemplo ms tpicos son las aplicaciones para PC, como por ejemplo: Un
procesador de texto.

Diagrama de Estado Finito o Diagrama de Transicin de Estados


Un Diagrama de Estado Finito es un grfico que representa los diferentes estados
de una MEF y todas las transiciones posibles entre los estados.
Como ejemplo, consideremos un muy simplificado sistema de control de un
ascensor:

Estados: El sistema est formado por tres estados: DETENIDO, YENDO_ARRIBA y


YENDO_ABAJO. Los diferentes estados se los representa mediante bloques
cuadrados (como en este caso) o crculos.
Transiciones: Las transiciones se las representa mediante flechas que indican la
direccin de transicin de un estado a otro.
Eventos: Los eventos para el sistema en este ejemplo son los siguientes:

seleccion_piso: Es un evento externo que se genera toda vez que un usuario


selecciona un piso o llama al ascensor desde otro piso.

arribo_nuevo_piso: Es un evento interno que se genera cada vez que los


sensores detectan que se ha arribado al nuevo piso seleccionado por el usuario.

Los eventos se anotan en el grfico por encima de las flechas de transicin.


Condiciones de Transicin: Dos transiciones en este sistema de ejemplo tienen
asociadas sus respectivas Condiciones de Transicin. No todas las transiciones
poseen Condiciones de Transicin.

piso_nuevo > piso_actual: Es la condicin necesaria para que se produzca


una transicin del estado DETENIDO al estado YENDO_ARRIBA.

piso_nuevo < piso_actual: Es la condicin necesaria para que se produzca


una transicin del estado DETENIDO al estado YENDO_ABAJO.
Las Condiciones de Transicin se anotan por debajo de las flechas de transicin.

Una pseudo transicin inicial del punto rojo al estado DETENIDO identifica a este
ltimo como el estado inicial de la MEF.

Codificacin en Lenguaje C
El sistema de control del ascensor se puede codificar en Lenguaje C de la siguiente
manera:
/* Ejemplo de Mquina de Estado Finito para un ascensor simplificado */
enum eEstados {

// Los estados se la MEF se definen en una enumeracion

DETENIDO,
YENDO_ARRIBA,
YENDO_ABAJO
} estado;

int piso_nuevo, piso_actual;


main() {
estado = DETENIDO;

// La MEF se inicializa en estado DETENIDO

while (TRUE) {
switch (estado) {
case DETENIDO:{

//

// Verificar si se ha seleccionado un nuevo piso:


piso_nuevo = seleccion_piso();
if (piso_nuevo > piso_actual)
estado = YENDO_ARRIBA;
else if (piso_nuevo < piso_actual)
estado = YENDO_ABAJO;
} break;
case YENDO_ARRIBA:{

piso_actual = comprobacion_piso();
if (piso_nuevo == piso_actual)
estado = DETENIDO;
} break;
case YENDO_ABAJO:{
piso_actual = comprobacion_piso();
if (piso_nuevo == piso_actual)
estado = DETENIDO;
} break;
}
}
}

Como se ve arriba, la MEF se codifica generalmente en un bloque "switch - case".


Todos los estados del sistema estn definidos en una enumeracin "enum { ... }" y
la variable "estado" almacena el estado actual del sistema.
Cada opcin "case" representa un estado particular de la MEF:

case DETENIDO:{ ... }

case YENDO_ARRIBA:{ ... }

case YENDO_ABAJO:{ ... }


Las transiciones en la MEF se codifican mediante una reasignacin de un nuevo
estado a la variable de estado:

estado = YENDO_ARRIBA;

estado = DETENIDO;
Las condiciones de transicin se codifican mediante sentencias condicionales "if else" asociadas a una determinada transicin:

if (piso_nuevo > piso_actual) ... else ...

if (piso_nuevo < piso_actual) ... else ...


En una MEF se asocian acciones o respuestas del sistema (salidas) ya sea con los
mismos estados o con las transiciones, por ejemplo, al pasar del estado DETENIDO
al estado YENDO_ARRIBA, se activa el motor correspondiente que mueve el
ascensor hacia arriba. Al llegar al nuevo piso (cambio de estado de YENDO_ARRIBA
a DETENIDO) el motor se desactiva; por supuesto estos detalles han sido omitidos
en el ejemplo por conveniencia para no complicar la descripcin del mismo.

Las Mquinas de Estado Finito no son Diagramas de Flujo


Las MEF no son diagramas de flujo y no deben confundirse con los mismos. En una
MEF las acciones se asocian con las flechas (transiciones), mientras que un
Diagrama de Flujo las acciones se asocian a los vrtices de la flecha o a los
bloques de proceso. Cuando una MEF se encuentra en uno de sus estados,
bsicamente se encuentra "en reposo" esperando a que suceda un evento,
mientras que en un Diagrama de Flujo el sistema se encuentra activo realizando
una tarea.

Tipos de Mquinas de Estado Finito

Existen principalmente dos tipos de Mquinas de Estado Finito: Las Reconocedoras


o Detectoras y las Transductoras.
Reconocedoras o Detectoras: Llamadas tambin Detectoras de Secuencia,
realizan bsicamente la deteccin de patrones o secuencias determinadas en
respuesta a las entradas recibidas. Por su definicin terica este tipo de sistema no
proveen seales de salida (acciones), simplemente transicionan desde un estado
inicial a un estado final de "Exito", en cuyo caso se entiende que un patrn o
secuencia ha sido reconocida exitosamente. Las MEF Detectoras de Secuencia son
tiles en aplicaciones en las que se necesita verificar contraseas, cdigos o la
validacin de paquetes de datos en transmisin digital, este ltimo un ejemplo
muy tpico de su uso. A continuacin se muestra el ejemplo de una verificacin de
un cdigo / contrasea con una MEF Detectora de Secuencia:

En este ejemplo el nico patrn que la MEF aceptar y reconocer es: 57936. (En
realidad cualquier patrn ms largo que contenga la secuencia anterior, como:
1257936 o 5793688 ser tambin reconocido por la MEF, sin embargo la
verificacin de estos casos se ha omitido en el ejemplo por simplicidad).
El estado inicial de la MEF es el denominado "Ninguno". Cualquier evento (nmero)
diferente a 5 causar una transicin al mismo estado y slo la recepcin de un "5"
causar la transicin al estado "1 Bueno". La recepcin de un "7" en el estado "1

Bueno" causar una transicin al estado "2 Buenos", cualquier otro valor diferente
causar una transicin a "Ninguno", lo cual obliga a reiniciar todo el proceso; y as
sucesivamente hasta llegar al estado "4 Buenos".
En el estado "4 Buenos", un "6" causar una transicin a "Abierto". A dicha
transicin est asociada una accin (salida) del sistema, la cual consiste en
"desasegurar" (por ejemplo: abrir una cerradura). Cualquier otro valor diferente de
"6" obliga a reiniciar el proceso desde "Ninguno".
En el estado "Abierto", un evento "cerrar" (por ejemplo, cerrar la puerta asociada a
la cerradura) causar que el sistema transicione a "Ninguno" y a dicha transicin
viene tambin asociada una accin o salida del sistema que consiste en "asegurar"
el sistema (cerrojo).
Transductoras: Las MEFs transductoras se caracterizan por generar acciones o
salidas dependiendo de las entradas y/o estados; se implementan en sistemas
embebidos tpicamente para aplicaciones de control. Un ejemplo de este tipo de
sistema es el ejemplo del ascensor ya analizado en la primera parte de este
artculo.

Ventajas de las Mquinas de Estado Finito

Son intuitivas y fciles de entender.


Abstraen convenientemente detalles secundarios que no son necesarios
para el anlisis del sistema a un alto nivel y se centran en aspectos claves del
mismo.

Aportan un componente visual que facilita el anlisis y diseo del sistema.

Son universalmente aplicables.

Su uso es comn un sistemas de transmisin de datos y el uso de protocolos


de comunicacin.

En programacin minimiza grandemente la tendencia a escribir "cdigo


espagueti" y puede ayudar a reducir la cantidad de variable globales necesarias,
aumentando al mismo tiempo la confiabilidad del sistema.

Desventajas de las Mquinas de Estado Finito

No son aplicables a todos los problemas de diseo.

Funcionan bien en sistemas pequeos con una cantidad de estados en el


orden de las decenas.

No funcionan bien en sistemas con una cantidad de estados en el orden de


las centenas o miles de estados, aunque en estos casos es posible la
estructuracin mediante una combinacin de MEFs ms pequeas.

La adicin de funcionalidad es un poco inflexible.

Son "planas" por naturaleza, no poseen estructura definida y no permiten


una jerarquizacin de los componentes que minimize la repeticin innecesaria de
ciertos estados. Una mejor alternativa en este caso es el uso de las Cartillas de
Estado (Statecharts) y el uso de UML (Unified Modelling Language).

Es fcil caer en el error de definir demasiados estados para el sistema, lo


cual minimiza la eficiencia, o de definir menos estados de lo que es necesario, lo
cual contradice al propsito de las MEFs de reducir la cantidad de cdigo
convolucionado (demasiadas sentencias condicionales del tipo "if - then - else").

Finalmente
Casi todos los que trabajamos, estudiamos o experimentamos con sistemas
embebidos hemos dado nuestros primeros pasos en la programacin de sistemas
embebidos escribiendo el llamado "cdigo espagueti". Algunos hemos llegado a
usar con relativa seguridad el patrn de programacin conocido como "Plano
Principal / Plano Secundario" (Backgroud / Foreground) el cual implica el uso de
interrupciones; aunque la realidad prueba que muchos estudiantes universitarios o
egresados de electrnica o otras carreras afines que tienen que ver con diseo
embebido no han llegado a dominar adecuadamente el uso de interrupciones
(hago nfasis en la palabra "adecuadamente").
Cunto menos conocido y entendido es el uso del patrn de programacin con
Mquinas de Estado Finito, las cuales, no es de sorprenderse, son una herramienta
cuyo uso est ampliamente extendido en el mbito del desarrollo de sistemas
embebidos de primer nivel. Muchos desarrolladores profesionales han
recomendado en repetidas ocasiones que, cualquier sistema reactivo que se preste
al diseo con Mquinas de Estado Finito (pues, obviamente, no todos se prestan,
pero s una mayora), debera hacer uso de este patrn de programacin, debido a
que ste provee un abstraccin del sistema que resulta natural, segura, fcil de
entender y que puede ser muy eficiente.
Si an no lo has hecho, es hora de darle a las Mquinas de Estado Finito un uso
ms frecuente. Con toda seguridad encontrars que tus proyectos se simplifican en

gran manera, aunque por supuesto, dominar el uso de las Mquinas de Estado
Finito requiere que uno pase un buen tiempo estudindolas y usndolas.

También podría gustarte