我正在寻找C中一维状态表的一些实现(想法)。转换是一种包含以下内容的对象(struct):
我在看C state-machine design但在我的情况下,我有多个条件来组建一个事件。 是否有适用于嵌入式系统的通用方法或简单的FSM sw处理器?
答案 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)。当然,遍历列表也需要递归。