我需要为硬件设备制造一台状态机。它将有超过25个州,我不知道应该采用什么设计。
因为我使用的是C++11,所以我想使用OOP并使用State Pattern实现它,但我不认为它适合嵌入式系统。
它应该更像C风格的设计吗?我以前一次都没编码过。有人能给我指点什么是最适合的设计吗?
系统信息:
ARM Cortex-M4
1 MB Flash
196 KB Ram我还看到了这问题,被接受的答案指向表设计,另一个答案指向State pattern设计。
发布于 2014-05-15 20:16:47
State模式效率不高,因为任何函数调用都至少要通过指针和vtable查找,但是只要您不每2或3个时钟周期更新状态或在时间关键循环中调用状态机函数,您就应该没事。毕竟,M4是一个相当强大的微控制器。
问题是,你是否需要它。在我看来,状态模式只是有意义的,如果在每种状态中,对象的行为都有很大的不同(在每种状态中需要不同的内部变量),如果您不想在状态转换期间传递变量值。
如果您的TS只是在读取事件α并在此过程中发射信号β时从A到B的转换,那么基于表或开关的经典方法就更明智了。
编辑:
我只想澄清一下,我的回答并不是作为反对c++或OOP的声明,我在这里肯定会使用它们(主要是出于个人喜好)。我只想指出,State Pattern可能有些过分,仅仅因为一个人在使用c++并不意味着他/她必须在任何地方使用类层次结构、多态性和特殊的设计模式。
发布于 2014-05-15 20:05:50
考虑一下QP主动对象框架,一种在嵌入式系统中实现分层状态机的框架。这本书是在米罗·萨梅克( Miro Samek )的书“C/C++中实用的UML状态图:面向嵌入式系统的事件驱动编程”中描述的。此外,本书第3章还描述了在C和C++中实现状态机的更传统方法。
发布于 2014-05-15 18:25:39
上课没什么不对的。您可以定义一个' State‘枚举,并在事件中使用case开关状态来访问corect操作代码/函数,从而传递或队列。我更喜欢简单的硬件控制状态引擎,而不是经典的‘状态机101’表驱动方法。表驱动的引擎非常灵活,但对于复杂的功能来说,可能会变得有点复杂,调试起来也会更加困难。
它应该更像C风格的设计吗?
高德,不!
https://stackoverflow.com/questions/23685682
复制相似问题