嵌入式系统状态模式:存储与异步事件相关的信息
Embedded System State Pattern: Storing information related to asynchronous events
我有一个嵌入式系统软件,在那里我完成了一系列硬件初始化步骤,然后根据发生的事件的历史转到模式1或模式2。即使在特定模式下,我也会根据事件的历史来做某些事情
例如。如果我的显示器关闭,那么在模式1中,我会采用与显示器打开时不同的流。并且显示通知异步到达,我不会明确查询该信息。
很少有其他类似的事件异步到达,可以改变我将采取的进一步行动。
我正在努力了解如何存储与过去发生的这些事件有关的信息。我倾向于将它们存储为标志,但这会破坏使用状态模式的目的(而且它也容易出错)。
我的另一个选择是将这些信息存储在状态本身中,例如。模式1_DisplayOff_Atrribx、模式1_DisplayOff_Atrrib、模式2_DisplayOff_Atrribx和模式2_DisplayOff_Atrriby。但我担心这会使国家机器变得复杂。
这里的正确方法应该是什么?
(问题不一定与嵌入式系统有关)
针对这种情况,或任何具有复杂状态处理的情况的一些一般设计建议:
-
总体设计建议:尽可能简单。追求简单,而不是复杂。
-
创建一个对应于";"模式"事件"标志";等等。这可以根据需要简单或高级-有时您可能需要实现子状态(例如,在状态"错误"中,有子状态"错误显示"answers"错误adc"等)。
-
避免旗帜丛林:你必须从众多来源收集旗帜,这已经够糟糕的了。如果您还将此与本地决策者相结合,您将不得不在整个程序中编写复杂的代码,因为本地决策者会导致状态更改。很快就不可能跟踪程序流和代码覆盖率。
这也往往导致许多本可以相互独立的模块之间的紧密耦合,这总是一件非常糟糕的事情。
-
为所有状态实现一个标准化的错误处理程序,使用标准的错误数据类型(错误编号、错误来源等)。
-
保持异步信息收集与状态机分离。也就是说,如果异步事件的发生与程序当前执行的状态无关。如果它们没有,你就必须将它们集成到状态机中。
-
将下一步的决策集中在程序中的一个位置。最好与错误处理程序相结合。
然后你的主循环看起来像:
for(;;)
{
state_result = state_machine[current_state]();
event_result = gather_event(); // might need several of these
current_state = evaluate_results (state_result, event_result);
}
其中evaluate_results
是程序中允许发生状态更改的唯一位置。这个函数只关心下一步执行什么状态,不执行任何实际工作。
- 正在查找文档以获得PS4平台的C++中的设备信息
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- Android NDK传感器向事件队列报告奇怪的间隔
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 从文本文件中读取时钟时间和事件时间并进行处理
- WMI检测进程创建事件-c++
- EvtExportLogneneneba API正在将远程计算机的事件日志保存到远程PC本身.如何将其保存到主机
- 如何设置一个范围来提取我想要获得的信息
- 处理闪烁窗口事件
- C++Builder中的OnClick事件签名存在问题
- 跟踪滚动条上的鼠标事件
- 什么是事件表 (wxWidgets)?
- 如何在 MFCaptureEngine 中获取"Camera removed"事件
- 给定顺序中的事件处理
- 当服务中的事件被触发时,如何将响应从服务发送回客户端?
- 系统参数信息A 与 SPI_GETMOUSE 返回 0
- 为什么 gcovr 会生成空覆盖率统计信息?
- 制作包含地图或场景信息的文件,例如要加载的资源、对象、位置、事件
- 是否可以获得有关在Qt中发布事件的控件的信息
- 嵌入式系统状态模式:存储与异步事件相关的信息