Beruflich Dokumente
Kultur Dokumente
DEPARTAMENTO DE ELECTRONICA
Programación de máquinas de estado.
Definiciones.
Un diagrama de estados puede emplearse para describir la conducta de un programa que
cambia entre estados, conducido por eventos externos y realizando acciones al efectuar
transiciones de un estado a otro.
Un estado es una condición del sistema que persiste durante un tiempo significativo de
tiempo.
Un evento es un mensaje hacia la máquina de estados producido por una entrada externa.
Una transición es un cambio de un estado a otro, disparada generalmente por un evento.
Una acción es una tarea que puede tomar lugar durante una transición, cuando se entra o
sale de un estado.
Una interrupción es un evento que puede disparar una transición.
Se requiere generar un sistema procesador de eventos que transforme los eventos que llegan
en acciones de salida; es decir, un sistema que reaccione frente a los eventos, que pueden
generarse en forma concurrente o paralela.
Sólo si los eventos llegan en el orden correcto la máquina funcionará en forma adecuada;
sin embargo existen numerosas situaciones en que se producen errores, ya sea por errores
del usuario o por excepciones debidas a mal funcionamiento o por operaciones con
resultados que implican la cancelación de la operación. La especificación requiere controlar
un gran número de eventos independientes, esta situación es modelada adecuadamente por
un diagrama de estados que provee una visión de alto nivel del diseño.
La complejidad del control suele ser la mayor dificultad en el diseño de aplicaciones, y por
esto cobran importancia los métodos de diseño y las herramientas que se utilicen.
El uso principal del diagrama de estados es capturar el flujo de ejecución de las acciones, la
parte manipulación de datos puede tratarse aparte.
Existen algoritmos para traducir un diagrama de estados en un programa C dirigido por una
tabla o diagrama de estados.
La estructura del programa debe secuenciado por una tabla. Todas las transiciones deben
aparecer como entradas de la tabla. Para que el código resulte determinístico, en tiempo de
ejecución, debe poder determinarse cuál es la próxima transición que será ejecutada.
Esto puede lograrse con la serialización de los eventos o bien condicionando algunas
transiciones (guards) que aseguren que solamente es posible realizar una determinada
transición desde cualquier estado.
Esquema de la arquitectura.
/* Do forever */
while (1)
{
while (queden eventos pendientes)
{
if (no se puede conocer cual es el próximo evento) ProceseErrorEvento();