用C ++实现嵌入式系统的状态机

时间:2015-12-20 13:49:02

标签: c++ oop switch-statement embedded motion

设计一个简单的电机控制器,它可以处于(至少)4种状态 - 空闲 - 加速 - 最大速度 - 减速。

我认为尝试实现某种状态机是最好的方法。目前,使用switch语句似乎是一个很好的解决方案,因为它简单,它将允许我保留所有"运动的东西"在一个对象中(让我们称之为移动)。

这看起来合情合理吗?谁能建议更合适的方法? 我知道有些人喜欢将每个状态分成对象,但是在为MCU编写时,有几个人告诉我要避免继承。

1 个答案:

答案 0 :(得分:2)

我不会在这里使用继承,不是因为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模式不同,状态实现不了解其他状态实现。

不要在那里放任何抽象。或者把它放在那里,但保留原始版本然后进行比较。