中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么用C語言實現狀態機

發布時間:2021-11-22 15:37:45 來源:億速云 閱讀:762 作者:iii 欄目:互聯網科技

這篇文章主要講解了“怎么用C語言實現狀態機”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“怎么用C語言實現狀態機”吧!

傳統的實現方案
  • if...else : 搞一大堆if else, 一個函數寫很長很長......

  • swich...case : 也搞一大堆一個函數寫很長很長......

    先來看看最近做的一個項目,無線通信協議實現的狀態機是什么樣子的:

怎么用C語言實現狀態機

    有三種類型的事件:上層下達的命令事件;下層到達的標志和數據傳輸事件;超時定時器超時事件。有10種狀態,關聯性很大,復雜了吧,這要是各種if/else的要寫到什么時候呢。

    在事件中判斷狀態,在狀態中判斷事件,橫豎兩種寫法的代碼都比較冗長,看起來呢也不大好,一旦增減,就又要動腦子重新梳理一遍,很累的。

    怎么去寫呢?其狀態機原理:在根據當前狀態(cur_state) 下,發生事件(event)后,轉移到下一個狀態號(nxt_state),決定執行的動作(action)。盜用一個圖吧

怎么用C語言實現狀態機

    這里我們首先定義一個結構體如下:

typedef struct {  State curState;//當前狀態  EventID eventId;//事件ID  State nextState;//下個狀態  Action action;//具體表現}StateTransform;

    我們假設有3種狀態,這里可以隨意增加,狀態枚舉如下:

typedef enum {  state_1=1,  state_2,  state_3}State;

    我們假設有5個事件,也可以隨意增加,事件ID枚舉如下:

typedef enum{  event_1=1,  event_2,  event_3,  event_4,  event_5}EventID;

    將其封裝起來在StateMachine中:

typedef struct{  State state;  int transNum;  StateTransform* transform;}StateMachine;

    具體流程:當前狀態-有事件觸發-跳到下個狀態-具體表現,重構代碼

StateTransform* findTranss(StateMachine* pSM,  const EventID evt){  int i;  for (i = 0; i < pSM->transNum; i++) {    if ((pSM->transform[i].curState == pSM->state) && (pSM->transform[i].eventId == evt)) {      return &pSM->transform[i];    }  }  return NULL;}

    狀態機實現如下:

void runStateMachine(StateMachine* pSM, EventID evt) {  StateTransform* pTrans;  pTrans = findTranss(pSM, evt);  if (pTrans == NULL)  {    xil_printf( "CurState= %s Do not process enent: %s\r\n", pSM->state,evt);    return;  }  pSM->state = pTrans->nextState;  Action act = pTrans->action;  if (act == NULL) {    xil_printf( "change state to %s. No action\r\n",pSM->state);    return;  }  act(&evt);}

    最后我模擬一些隨機事件,我們只需要弄清楚事件ID,狀態切換,具體表現就可以了,在代碼中就是填寫  stateTran[] 這個表,一旦有增減事件,狀態等等,也不需要再去使用switch/case,特費腦,其代碼如下:

int run(){  StateMachine stateMachine;  stateMachine.state = state_1;  stateMachine.transNum = 7;  StateTransform stateTran[] = {    {state_1,event_3,state_2,f121},    {state_1,event_4,state_2,NULL},    {state_2,event_1,state_3,f231},    {state_2,event_4,state_2,f221},    {state_3,event_2,state_1,f311},    {state_3,event_3,state_2,f321},    {state_3,event_5,state_3,f331}  };  stateMachine.transform = stateTran;
 EventID inputEvent[15] =  { event_1, event_2, event_3, event_4, event_5,    event_1, event_2, event_3, event_4, event_5,    event_1, event_2, event_3, event_4, event_5 };
 int i;  for (i = 0; i < 15; i++) {    runStateMachine(&stateMachine, inputEvent[i]);  }  return 0;}

    最后運行結果如下

怎么用C語言實現狀態機

感謝各位的閱讀,以上就是“怎么用C語言實現狀態機”的內容了,經過本文的學習后,相信大家對怎么用C語言實現狀態機這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

铜鼓县| 宁国市| 台江县| 松滋市| 仁寿县| 大足县| 德州市| 东宁县| 孝义市| 石柱| 类乌齐县| 舞阳县| 绥中县| 瑞丽市| 龙游县| 寿阳县| 古蔺县| 南安市| 青川县| 扶沟县| 壶关县| 东阿县| 石阡县| 页游| 崇明县| 宕昌县| 安新县| 呼和浩特市| 平和县| 鞍山市| 松滋市| 宁津县| 蚌埠市| 桦甸市| 化隆| 手游| 若尔盖县| 翁源县| 齐河县| 绍兴市| 肥西县|