用C++为嵌入式系统实现一个状态机
Implementing a State Machine in C++ for Embedded System
我正在设计一个简单的电机控制器,它可以(至少)处于4种状态-怠速-加速-最大速度-减速。
我认为尝试实现某种状态机将是最好的方法。目前,使用switch语句似乎是一个很好的解决方案,因为它很简单,而且它允许我将所有的"运动内容"保留在一个对象中(让我们称之为Move)。
这看起来明智吗?有人能提出一个更合适的方法吗?我知道有些人更喜欢将每个状态拆分为其对象,但有几个人告诉我,在为MCU编写时要避免继承。
我不会在这里使用继承,不是因为MCU,而是因为继承意味着抽象,而对4个状态的抽象是不值得的(当然,也有例外)。
您必须决定是否要分离状态上下文。如果没有,那就把它放在一个班里。如果你最终有很多方法和属性,你应该把它拆分
如果你需要拆分,要么使用状态模式,要么,如果你没有很多状态,保持简单:
为每个状态定义一个类。此类表示状态行为。不要忘记使用构造函数作为进入点,使用析构函数作为离开点。
然后定义一个FSM类以在状态之间切换。FSM应该包含一个循环,用于创建当前状态、运行它、检查它的状态,并在需要时销毁当前状态并创建下一个状态。
示例:
// Idle
class Idle {
public:
Idle() {
// entry point
}
~Idle() {
// leaving point
}
void step() {
// actual work
}
// some getters to examine state
private:
// helper methods
// state attributes (context)
};
class FSM {
public:
void run() {
State current(sIdle);
while (current != sExit) {
switch (current) {
case sIdle: {
Idle ctx;
ctx.step();
// examine state
// get user input or
// call step() again or
// decide next state:
current = Accelerate;
break;
}
...
}
}
我喜欢这个设计的地方是简单,没有函子(与State模式不同),并且在构建下一个状态之前,当前状态会被破坏。此外,与State模式不同,State实现不了解其他状态实现。
不要把任何抽象概念放在那里。或者放在那里,但保留原始版本,然后进行比较。
相关文章:
- 如何在使用 Boost MSM 编写的状态机中直接访问任何状态
- 启动状态机无法在启动时处理内部转换
- 实现C++状态机.如何解决Wpmf对流警告
- 无法使用模板参数编译提升元状态机
- Boost状态机语言-"操作"中的"发布"事件
- 将C++数据模型与Qt SCXML状态机一起使用
- 如何在 boost::msm 中实现可以访问状态机 (SM) 的后端/前端的"BaseState"
- 分层状态机涉及哪些原则,以及如何实现基本模型?
- 如何在状态内创建状态机?
- 状态机与开关情况
- C++状态机,继承了具有语法不正确的成员值的类
- c++有限状态机
- CXX 库,用于具有运行时操作的有限状态机/自动机
- QTSCXML状态机中的事件处理
- 如何动态创建状态机
- 状态机表示
- 将Java状态机示例转换为C++,陷入最后一道障碍
- QT状态机:如何在初始状态下设置防护措施
- 用C++为嵌入式系统实现一个状态机
- 一个尝试非确定性有限状态机(c++),是静态std::map的好主意