基於時間系統的狀態機

2022-06-17 19:36:12 字數 1238 閱讀 7896

1根據各任務的週期執行時間確定輪詢間隔,注意(輪詢時間間隔只能比任務執行時間稍長,但一定不能斷)

2 用乙個定時器,基準定時為各任務的最小公倍數;軟體計數器累加從而觸發各任務標誌(對任務進行位元組編碼)

3主函式中分別操作:toggle_task();//設定各標誌,這裡可以是非時間觸發的事件

slect_task();//對任務標誌進行位元組解碼:指標函式指向不同的具體函式

如果不是空函式(狀態陷阱)就用指標函式呼叫各具體函式。

注意:1 狀態機程式設計思想要貫徹整個設計,即分層狀態機,每個狀態又分成各子狀態。

2 各狀態函式中的狀態指示要用靜態變數,即便被中斷斷開,下次還可以接著之前的狀態繼續進行。要注意非同步事件時的現場保護。

3基於時間片和非同步事件的任務觸發要仔細分析優先順序,對多事件觸發如何處理(可以做變通方法。)

int main(void)

if((++i)>=task_num) i = 0;}}

void tim3_irqhandler(void) //tim3 中斷

}void task0(void)

f((ctimer & bitmak_task2) == 0x02)//20ms 任務1

*************************架構2*************************====

#define        void_func            ((void *)0) 

#typedef     void pfunc_type(void)

pfunc_type present_task =void_func;

typedef union  taskflag_bitsflag;

}taskflag_bits,*taskflag_bits_pt;  

taskflag_bits taskflag;

int main(void)

void task_trigger(void)

/*至少有乙個初始引導條件*/

if(某個條件具備)/*時間到或者非同步事件觸發*/

taskflag.flag.task1=1;

if(某個條件具備)

taskflag.flag.task2=1;

void task_select(void)

if (taskflag.flag.task0)

if (taskflag.flag.task1)

present_task = void_func;/*預設*/

基於狀態機的訂單系統

前言 本文針對民宿業務下訂單系統狀態管理提出了一種解決方案 通過有限狀態機極大的簡化訂單狀態的遷移處理,同時使訂單狀態變得可控。此處的狀態機指 有限狀態機 有限狀態機 英語 finite state machine,縮寫 fsm 又稱有限狀態自動機,簡稱狀態機,是表示有限個狀態以及在這些狀態之間的轉...

狀態機 狀態機0

近半年都忙於做專案,沒有太多的時間去整理和總結在專案中用過的技術 個人還是覺得技術需要總結提煉和沉澱的,忙到沒時間去總結提公升其實不 是什麼好事,這次講下狀態機,在戰鬥型別的遊戲中角色有多種不同的狀態,而狀態的切換錯綜複雜,23種設計模式中有一種模式叫做狀態模式,不過 這種模式是把狀態切換條件放到各...

基於狀態機的按鍵程式

基於狀態機的按鍵程式 一般的按鍵輸入軟體介面程式非常簡單,在程式中一旦檢測到按鍵輸入口為低電平 有時可能為高 便採用軟體延時的方法來進行消抖,然後再次檢測按鍵輸入,如果再次確認為低電平則表示有按鍵按下,轉入執行按鍵處理程式。如果延時後檢測的電平為高電平則放棄本次按鍵檢測,重新開始一次按鍵檢測過程。在...