一维状态转换表

时间:2011-03-25 11:32:35

标签: c embedded transition state-machine

我正在寻找C中一维状态表的一些实现(想法)。转换是一种包含以下内容的对象(struct):

  • 指向保护功能的指针
  • 下一个州
  • 动作函数指针列表。

我在看C state-machine design但在我的情况下,我有多个条件来组建一个事件。 是否有适用于嵌入式系统的通用方法或简单的FSM sw处理器?

2 个答案:

答案 0 :(得分:0)

StateMachine表通常有2个维度(我在哪里),(我有什么符号/标记/来源), 并且两者的交集都是单元格(我将从哪里开始,当我有什么符号/标记/来源时)

答案 1 :(得分:0)

通常的方法是存储指向条件函数的指针。 您将条件集实现为单独的函数,并在表中附加指向正确条件的指针。每个函数测试给定的条件集。您遍历列表,直到其中一个指向的函数返回true。当然,“当前状态”可以用作条件的一部分,这样就不需要2d数组。

  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,如果测试a的计算量很大,则需要的CPU时间比必要的多得多。

在这种情况下,您必须将condition_set -> event列表重新映射到单个决策树中 - 维护起来要困难得多,但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表示“没有这样的项目”(“test”除外,它不能为null)。当然,遍历列表也需要递归。