我找一些實施C.包含一維狀態表的(想法)的過渡是一種對象(結構):一維狀態轉移表
- 指向後衛功能
- 下一頁狀態
- 指針操作的函數列表。
我正看着C state-machine design但在我的情況下,我有多種條件來形成一個事件。 有沒有適用於嵌入式系統的通用方法或簡單的FSM sw處理器?
我找一些實施C.包含一維狀態表的(想法)的過渡是一種對象(結構):一維狀態轉移表
我正看着C state-machine design但在我的情況下,我有多種條件來形成一個事件。 有沒有適用於嵌入式系統的通用方法或簡單的FSM sw處理器?
通常的方法是對存儲指向條件函數。 您可以將這組條件作爲單獨的函數實現,並將指針附加到表中的正確條件。每個功能測試給定的一組條件。您遍歷列表直到其中一個指向的函數返回true。當然,「當前狀態」可以用作條件的一部分,這消除了對二維數組的需要。
struct {
bool(*test)(); //the condition
void(*onsuccess)(); //event
} condition;
如有條件,在這樣一個鏈條重複了很多,這可能是低效的:
ev1: (a && b && c)
ev2: (a && !b && c)
ev3: (a && b && d)
ev4: (a && !b && !c)
ev5: (!a)
(大多數事件試驗a
分開,如果測試的是它需要更多的CPU計算昂貴時間超過需要)。
在這種情況下,你不得不重新映射condition_set -> event
list合併成一個決策樹 - 更難維持,但更多的CPU效率:
a:
b:
c: ev1
d: ev3
!b:
c: ev2
!c: ev4
!a: ev5
這當然不能是簡單的一維項目清單任何更多的,但需要一個樹形結構代替,比方說,支鏈鏈表:在任何指針
struct {
bool(*test)(); //the condition
void(*onsuccess)(); //event (if any)
condition* next_sibling; //other conditions dependent on parent but independent from this one,
condition* first_child; //other conditions dependent on this one,
} condition;
NULL意味着「沒有這樣的項」(除了在「測試」,其不能爲空) 。遍歷列表需要遞歸。
感謝您的反饋。 – Pepe 2011-04-02 16:34:57
StateMachine表通常有2個維度(我在哪裏),(我有什麼符號/標記/來源), 和它們的交點都是單元格(我要去哪裏,從哪裏出發,什麼時候符號/令牌/源我)
建議:可能要編輯您的標籤 - 我建議刪除「國家」與「機」,並用「的statemachine」代替。 – Dan 2011-03-25 16:15:49
你是什麼意思「多重條件組成事件」? – 2011-03-25 17:50:47