事件驅動有限狀態機

在計算機科學中，有限状态机（FSM）是事件驅動的，若從一個狀態到另一個狀態的轉換是由事件或是訊息所驅發的，這和有限状态机一詞出自的語法分析理論相反，其中將状态机描述為消費字元或是記號（tokens）的機器。

多半有限状态机是一個线程或行程，是較大應用程式的一部分，需要和其他程式通訊。例如，電信通訊協定大部份都會用事件驅動有限狀態機來表示。

C語言的例子
以下程式描述一個簡單汽車收音機系統的狀態機，基本上是一個讀取事件的無窮迴圈，狀態機有二個狀態：收音機模式，以及CD模式。其事件有「模式切換」（收音機模式和CD模式之間的切換）以及「下一個」（下一個廣播電台或是CD的下一軌）。

/********************************************************************/
#include <stdio.h>

/********************************************************************/
typedef enum {
        ST_RADIO,
        ST_CD
} STATES;

typedef enum {
        EVT_MODE,
        EVT_NEXT
} EVENTS;

EVENTS readEventFromMessageQueue(void);

/********************************************************************/
int main(void)
{
  /* Default state is radio */  
  STATES state = ST_RADIO;
  int stationNumber = 0;
  int trackNumber = 0;

  /* Infinite loop */
  while (1)
  {
    /* Read the next incoming event. Usually this is a blocking function. */
    EVENTS event = readEventFromMessageQueue();

    /* Switch the state and the event to execute the right transition. */
    switch (state)
    {
      case ST_RADIO:
        switch (event)
        {
          case EVT_MODE:
            /* Change the state */
            state = ST_CD;
            break;
          case EVT_NEXT:
            /* Increase the station number */
            stationNumber++;
            break;
        }
        break;

      case ST_CD:
        switch (event)
        {
          case EVT_MODE:
            /* Change the state */
            state = ST_RADIO;
            break;
          case EVT_NEXT:
            /* Go to the next track */
            trackNumber++;
            break;
        }
        break;
    }
  }
}

相關條目
 有限状态机


延伸閱讀

Category:计算模型