2011-03-25 40 views
0

我找一些實施C.包含一維狀態表的(想法)的過渡是一種對象(結構):一維狀態轉移表

  • 指向後衛功能
  • 下一頁狀態
  • 指針操作的函數列表。

我正看着C state-machine design但在我的情況下,我有多種條件來形成一個事件。 有沒有適用於嵌入式系統的通用方法或簡單的FSM sw處理器?

+0

建議:可能要編輯您的標籤 - 我建議刪除「國家」與「機」,並用「的statemachine」代替。 – Dan 2011-03-25 16:15:49

+0

你是什麼意思「多重條件組成事件」? – 2011-03-25 17:50:47

回答

0

通常的方法是對存儲指向條件函數。 您可以將這組條件作爲單獨的函數實現,並將指針附加到表中的正確條件。每個功能測試給定的一組條件。您遍歷列表直到其中一個指向的函數返回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意味着「沒有這樣的項」(除了在「測試」,其不能爲空) 。遍歷列表需要遞歸。

+0

感謝您的反饋。 – Pepe 2011-04-02 16:34:57

0

StateMachine表通常有2個維度(我在哪裏),(我有什麼符號/標記/來源), 和它們的交點都是單元格(我要去哪裏,從哪裏出發,什麼時候符號/令牌/源我)