用C++为嵌入式系统实现一个状态机

Implementing a State Machine in C++ for Embedded System

本文关键字:一个 状态机 实现 C++ 嵌入式 系统      更新时间:2023-10-16

我正在设计一个简单的电机控制器,它可以(至少)处于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实现不了解其他状态实现。

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