【问题标题】:What design to apply for an embedded state machine [closed]申请嵌入式状态机的设计是什么[关闭]
【发布时间】:2014-07-04 08:09:46
【问题描述】:

我需要为硬件设备制作一个状态机。它将有超过 25 个州,我不确定要应用什么设计。

因为我使用的是C++11,所以我想到了使用OOP并使用State Pattern实现它,但我认为它不适合嵌入式系统。

应该更像C风格的设计吗?我以前没有编码过。有人可以给我一些关于什么是最适合的设计的建议吗?

系统信息:

ARM Cortex-M4  
1 MB Flash  
196 KB Ram

我还看到this 的问题,接受的答案指向表格设计,另一个答案指向State pattern 设计。

【问题讨论】:

  • 这真的取决于环境。如果您已经有一个 C++ 环境并且您对 C++ 很熟悉,为什么不使用它。然而,C++ 通常需要更多的支持;设置 C++ 支持可能比用任何语言编写状态机花费更多的时间。状态机可以是数据驱动的,也可以使用函数指针(代码驱动)来完成。许多“C”系统使用结构中的简单变量和switch/case 来实现state。状态通常只是 enum 和允许的转换;如何实现转换通常是困难的部分。
  • 另请参阅:Petri Nets,如果您在中断意义上是嵌入,则可能适用。 C++ 有非常好的语法来实现function pointers with state,这通常很有用,这取决于你希望你的状态机有多heavy
  • 状态机有点琐碎我不明白这个问题,任何和所有语言都可以正常工作。对于 arm cortex-m4 C 或 C++,只要从该平台的角度来看什么是好的语言/工具,您喜欢的任何一个都是您的最佳候选者。

标签: c++ c++11 embedded arm state-machine


【解决方案1】:

状态模式不是很有效,因为任何函数调用都至少通过指针和 vtable 查找,但只要您不每 2 或 3 个时钟周期更新一次状态或在一段时间内调用状态机函数关键循环你应该没问题。毕竟 M4 是一个相当强大的微控制器。

问题是,你是否需要它。在我看来,状态模式只有在每个状态下,对象的行为显着不同(每个状态需要不同的内部变量)并且你不想在状态转换期间保留变量值时才有意义.

如果您的 TS 只是在读取事件 alpha 并在此过程中发出信号 beta 时进行从 A 到 B 的转换,那么经典的基于 table 或 switch 的方法更明智。

编辑:

我只是想澄清一下,我的回答并不是针对 c++ 或 OOP 的声明,我肯定会在这里使用它(主要是出于个人喜好)。我只想指出State Pattern 可能有点过头了,仅仅因为使用 c++ 并不意味着他/她必须在任何地方使用类层次结构、多态性和特殊设计模式。

【讨论】:

    【解决方案2】:

    考虑QP active object framework,这是一个在嵌入式系统中实现分层状态机的框架。它在 Miro Samek 的书Practical UML Statecharts in C/C++: Event Driven Programming for Embedded Systems 中有描述。此外,本书的第 3 章描述了在 C 和 C++ 中实现状态机的更传统方法。

    【讨论】:

      【解决方案3】:

      上课没有错。您可以定义一个“状态”枚举并在事件中传递或排队,使用状态上的案例开关来访问正确的操作代码/功能。我更喜欢更简单的硬件控制状态引擎,而不是经典的“状态机 101”表驱动方法。表驱动引擎非常灵活,但对于复杂的功能可能会有些复杂,并且更难以调试。

      应该更像C风格的设计吗?

      天哪,不!

      【讨论】:

        猜你喜欢
        • 2013-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-22
        • 2020-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多