我找一些实施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