Händelsestyrd finite-state-maskin

Vid beräkning är en finita-tillståndsmaskin (FSM) händelsedriven om övergången från ett tillstånd till ett annat utlöses av en händelse eller ett meddelande . Detta är i motsats till ursprunget för parsing-teorin för termen finita-tillståndsmaskin där maskinen beskrivs som att den konsumerar tecken eller tokens .

Ofta är dessa maskiner implementerade som trådar eller processer som kommunicerar med varandra som en del av en större applikation. Till exempel är ett telekommunikationsprotokoll för det mesta implementerat som en händelsestyrd finite-state-maskin.

Exempel i C

Denna kod beskriver tillståndsmaskinen för ett mycket grundläggande bilradiosystem. Det är i grunden en oändlig loop som läser inkommande händelser. Tillståndsmaskinen har bara två tillstånd: radioläge eller CD-läge. Händelsen är antingen en lägesändring från radio till cd fram och tillbaka, eller en gå till nästa (nästa förinställning för radio eller nästa spår för cd).


 


  
        
        
 

  
        
        
 

 


 

    
     
     0
     0

  
   
  
    
       

    
     
    
       
         
        
           
            
              
            
           
            
            
            
        
        

       
         
        
           
            
              
            
           
            
            
            
        
        
    
  
 /************************************************** *******************/  #include  <stdio.h>  /********************** **********************************************/  typedef  enum  {  ST_RADIO  ,  ST_CD  }  ​​STATES  ;  typedef  enum  {  EVT_MODE  ,  EVT_NEXT  }  HÄNDELSER  ;  EVENTS  readEventFromMessageQueue  (  void  );  /************************************************** *******************/  int  main  (  void  )  {  /* Standardtillstånd är radio */  STATES  state  =  ST_RADIO  ;  int  stationNumber  =  ;  int  trackNumber  =  ;  /* Infinite loop */  while  (  1  )  {  /* Läs nästa inkommande händelse. Vanligtvis är detta en blockerande funktion.  */   EVENTS  event  =  readEventFromMessageQueue  ();  /* Byt tillstånd och händelse för att utföra rätt övergång. */   switch  (  state  )  {  case  ST_RADIO  :  switch  (  händelse  )  {  case  EVT_MODE  :  /* Ändra tillståndet */  state  =  ST_CD  ;  bryta  ;  case  EVT_NEXT  :  /* Öka stationsnumret */  stationNumber  ++  ;  bryta  ;  }  bryta  ;  case  ST_CD  :  switch  (  händelse  )  {  case  EVT_MODE  :  /* Ändra tillståndet */  state  =  ST_RADIO  ;  bryta  ;  case  EVT_NEXT  :  /* Gå till nästa spår */  trackNumber  ++  ;  bryta  ;  }  bryta  ;  }  }  } 

Se även

Vidare läsning

  •   Peatman, John B. (1977). Mikrodatorbaserad design . New York: McGraw-Hill, Inc. ISBN 0-07-049138-0 .
  •   Brookshear, J. Glenn (1989). Beräkningsteori: formella språk, automater och komplexitet . Redwood City, Kalifornien: Benjamin/Cummings Publish Company, Inc. ISBN 0-8053-0143-7 .