在工作忙碌的2月有餘後,今天想閒下來,總結一下前面的工作。今天來聊一下狀態機。
最早我在AT指令集裡面推薦過一種方式,採用的方式是switch加共同體的方式來進行。如下圖所示:
這種方式的好處如下:
1、可以隨意的在任何位置插入數據,大概率不需要對所有的case進行修改,注意在STA++這地方,用其他的標記防止在後續STA++的時候跳轉的特殊的位置,讓自己掉坑;
2、在用IAR 或者keil查看的是看到的是英文字符串,方便自己看設備運行狀態在什麼地方
小建議:
1、用switch的時候非常不建議在其他函數直接修改狀態機的值,這樣會讓自己程序滿天飛,建議非實時的情況下用條件判斷在switch內部做調整;如上圖的判斷等做狀態機的修改;
2、記得給switch語句加一個default,可以方便打斷點,看看跑飛的原因。
3、可以給switch加個null狀態,看看程序執行的頻率;
在使用上述的方式時,可以為特定的業務流程做狀態控制。但是當你的的狀態機因為業務需要需要隨時變更的時候,那麼上述的switch模式將是一個非常坑爹的事情,維護非常不方便,並且修改後還需要重複驗證狀態流程是否合理。防止某個STA跳轉出錯導致設備運行異常。
在這個時候,你需要採用指針函數的狀態機來完成這個事情了。用他相對而言更加的輕鬆。自己只需要專注於各個業務動作驗證,然後通過指針函數將各個業務串聯起來即可。
指針函數結構體我想到的如下圖:
按照上面的方式構建一個結構體:,
1、給指針函數起一個霸氣的名稱,方便自己記憶。
2、給指針函數導入適當的輸入輸出,以便自己能過傳遞一些控制參數;
3、如果必要給自己做一個完成標記的讀取,以便自己能夠知道任務已經完成;
4、為了安全可靠,加個錯誤處理方式
這就是一個基礎的狀態架構,有個名稱,有動作,有響應和安全。基於這個架構,然後你只需要按照自己的業務需求,將各個動作進行細分,類似把大象塞進冰箱,分成開門,把大象推進去,關門一樣。每個動作,你可以用switch的狀態機來做。不要霸氣到在做一個指針函數狀態機。相信我這不是在給自己爭取摸魚的時間,而是給自己帶來更多的麻煩。靈活的同義詞是多變。這不好控制!
完成上述的聲明後,你可以做一個類似這樣的模塊功能清單表:
到此你就成功的創建了一個摸魚動作,在函數前面做個注釋,會是一個好習慣,方便自己理解,也方便交接,我是因為摸魚後面要刪除,所以沒有注釋。
如何讓摸魚這個動作完美執行起來呢?
1、初始化摸魚動作
類似這樣,我們就可以在極短的時間內構建起一個執行2次動作的狀態。
2、執行動作
1、做一個list的功能函數,通過共同體的名稱,找到實際對應的函數,然後調用對應的函數。
2、查看list對應的執行完成狀態是否完成,如果完成繼續下一個動作;
3、查看list對應的錯誤狀態是否置位,如果置位則需要跳出這個執行動作,切換到異常處理中。
3、