En computación , una máquina de estados finitos (FSM) es impulsada por eventos si la transición de un estado a otro es provocada por un evento o un mensaje . Esto contrasta con los orígenes de la teoría del análisis sintáctico del término máquina de estados finitos, donde la máquina se describe como consumidora de caracteres o fichas .
A menudo, estas máquinas se implementan como subprocesos o procesos que se comunican entre sí como parte de una aplicación más grande. Por ejemplo, un protocolo de telecomunicaciones se implementa la mayor parte del tiempo como una máquina de estados finitos impulsada por eventos.
Ejemplo en C
Este código describe la máquina de estado para un sistema de radio de automóvil muy básico. Básicamente es un bucle infinito que lee eventos entrantes. La máquina de estado tiene solo 2 estados: modo de radio o modo de CD. El evento es un cambio de modo de radio a cd de ida y vuelta, o ir al siguiente (siguiente preset para radio o siguiente pista para CD).
/ ********************************************** ******************* / #include / ********************************************** ******************* / typedef enum { ST_RADIO , ST_CD } ESTADOS ;typedef enum { EVT_MODE , EVT_NEXT } EVENTOS ;EVENTOS readEventFromMessageQueue ( void );/ ********************************************** ******************* / int main ( void ) { / * El estado predeterminado es radio * / STATES state = ST_RADIO ; int stationNumber = 0 ; int trackNumber = 0 ; / * Bucle infinito * / while ( 1 ) { / * Leer el siguiente evento entrante. Por lo general, esta es una función de bloqueo. * / EVENTOS evento = readEventFromMessageQueue (); / * Cambia el estado y el evento para ejecutar la transición correcta. * / switch ( estado ) { case ST_RADIO : switch ( evento ) { case EVT_MODE : / * Cambiar el estado * / state = ST_CD ; romper ; case EVT_NEXT : / * Aumentar el número de estación * / stationNumber ++ ; romper ; } romper ; case ST_CD : switch ( evento ) { case EVT_MODE : / * Cambiar el estado * / state = ST_RADIO ; romper ; case EVT_NEXT : / * Ir a la siguiente pista * / trackNumber ++ ; romper ; } romper ; } } }