我需要为硬件设备制作状态机。它将有超过25个州,我不知道应用什么设计。
因为我使用C++11
我想使用OOP
并使用State Pattern
实现它,但我认为它不适合嵌入式系统。
它应该更像C风格的设计吗?我之前没有编码。有人可以给我一些关于什么是最合适的设计的指示吗?
系统信息:
ARM Cortex-M4
1 MB Flash
196 KB Ram
我也看到this问题,接受的答案指向表格设计,另一个答案指向State pattern
设计。
答案 0 :(得分:3)
状态模式效率不高,因为任何函数调用都至少通过指针和vtable查找,但只要你不是每2或3个时钟周期更新一次状态或者在一段时间内调用状态机函数关键循环你应该没事。毕竟M4是一个非常强大的微控制器。
问题是,你是否需要它。在我看来,状态模式只有意义,如果在每个状态中,对象的行为显着不同(在每个状态中需要不同的内部变量),并且如果您不希望在状态转换期间携带变量值。
如果你的TS仅仅是在读取事件alpha并在此过程中发出信号beta时从A转换到B,那么基于经典表格或开关的方法就更明智了。
编辑:
我只想澄清一下,我的答案并不是针对c ++或OOP的声明,我在这里肯定会使用(主要是出于个人喜好)。我只想指出State Pattern
可能是一种矫枉过正的原因,只是因为一个人使用c ++并不意味着他/她必须在任何地方使用类层次结构,多态和特殊设计模式。
答案 1 :(得分:1)
考虑QP active object framework,这是一个在嵌入式系统中实现分层状态机的框架。 Miro Samek在书中Practical UML Statecharts in C/C++: Event Driven Programming for Embedded Systems描述了这一点。此外,本书的第3章描述了在C和C ++中实现状态机的更传统方法。
答案 2 :(得分:0)
课程没什么问题。您可以在事件中定义“状态”枚举并传递或排队,使用State上的案例开关来访问corect操作代码/函数。对于比传统的“State-Machine 101”表驱动方法更简单的硬件控制状态引擎,我更喜欢这种方法。表驱动引擎非常灵活,但是对于复杂的功能而言可能会有点复杂,而且更难以调试。
它应该更像是C风格的设计吗?
Gawd,不!