2

我相当确定这是一个模板问题,因为我似乎无法以任何其他方式解决它 - 但也欢迎非模板解决方案。

有限状态机有许多程序状态,每个状态都可以对许多事件做出反应。

所以,我想为 Event、State 和 FSM 定义类。FSM 有一个状态集合(可能是向量,如果 STL 在嵌入式系统中出现问题,可能是链表),而 State 有一个事件集合。

每个状态和事件都有一个唯一的 Id 和一个用于调试 porpoise 的名称字符串。

尴尬的是,我不希望 Id 是整数,而是枚举的元素。每个 FSM 的状态和事件都有不同的枚举。

如何最好地编码?你能举两个简单的 FSM 的例子,或者一个有两个状态的 FSm,每个状态有两个事件吗?

例如,如果我有

枚举 myEvents {a, b, c};
枚举 hisEvents {d, e, f, g};

我希望能够声明一个接受构造函数参数的事件类

(myEvents a,char *"event_a")
(hisEvents g,char* "event_g")
请注意,我不想只重载构造函数,因为这是限制性的——如果添加了新的事件枚举怎么办?

与状态类似,然后让我的 FSM 每个都有一个状态列表。

或者我只是一个人,坚持使用 eventId 的枚举,而传递一个 int 会简单得多

谢谢。


顺便说一句,我宁愿避免使用 Boost,因为它本身不确定它在嵌入式系统中的工作情况。我更喜欢内部开发,以便完全控制。

4

2 回答 2

2

如果我理解正确,我不确定,但我会尝试一下:

我假设您想通过定义转换来定义状态机;例如“当处于状态 'myEvents' 并且你看到 'a' do 'event_a'”

class State {};
template<T> RealState : State
{
    static void Add(T event, char*) { /* save stuff */ }
};

class Event {};
template<T> RealEvent : Event    {
    RealEvent(T event, char* name) {RealState<T>(event, name); }
};

一些你需要采取的行动和诸如此类的东西,你会想把它弄糟以获得不止一个状态机,但我希望这能让你开始。

于 2010-01-08T03:48:27.303 回答
1

虽然我理解你为什么要通过一般地实现状态机基础来避免代码冗余,但我不明白你为什么要自己实现这个。

看看现有的实现,如Boost.Statechart或任何最适合您的使用场景的实现。

于 2010-01-08T05:36:47.027 回答