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種設計模式中有一種模式叫做狀態模式,不過 這種模式是把狀態切換條件放到各...
基於狀態機的按鍵程式
基於狀態機的按鍵程式 一般的按鍵輸入軟體介面程式非常簡單,在程式中一旦檢測到按鍵輸入口為低電平 有時可能為高 便採用軟體延時的方法來進行消抖,然後再次檢測按鍵輸入,如果再次確認為低電平則表示有按鍵按下,轉入執行按鍵處理程式。如果延時後檢測的電平為高電平則放棄本次按鍵檢測,重新開始一次按鍵檢測過程。在...