我已经使用 C 的 switch 语句为嵌入式系统实现了一个简单的状态机。我知道如果我使用带有查找表的函数指针会更好,但我将其保存为下一步。
我的状态机有以下状态:
- 启动(初始状态)
- 启动错误。
- 空闲(系统仅在此状态下检查输入。它不会更新显示或其他任何内容。它只是“空闲”)。
- 检查(这是实际应用)
- 程序
- 复制到内存
当系统启动时,它进入配置端口的启动状态,初始化显示并与连接在 SPI 总线上的 IC 握手,以确保一切正常。如果是,则系统进入空闲状态。如果不是,它进入启动错误状态,在 LCD 上显示一个错误,标记一个变量,然后进入空闲状态。
在空闲状态下,程序轮询微控制器上的 3 个引脚以检查 3 个按钮(检查、程序、复制到内存)中的一个是否被按下。根据按下的按钮,它会进入适当的状态,执行一些代码,更新 LCD,然后返回空闲状态。注意:如果系统中存在硬件故障,系统不关心是否按下按钮。启动错误状态标记一个名为 hardware_fault 的变量,如果设置该变量,则确保空闲状态不会打扰轮询任何输入按钮。
这是我第一次实现状态机,我只是不确定这是否是一个好的设计。我还没有真正看到 FSM 在空闲状态下轮询输入的任何示例。相反,似乎大多数示例本质上是相当连续的(例如计数器)。所以,我的问题是,我的设计合理吗?它确实有效,但正如这里的每个人都知道的那样,有糟糕的设计,然后有好的设计。