2011-03-25 41 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个维度(我在哪里),(我有什么符号/标记/来源), 和它们的交点都是单元格(我要去哪里,从哪里出发,什么时候符号/令牌/源我)