我有一个嵌入式系统软件,我会经历一系列硬件初始化步骤,然后根据发生的事件的历史记录转到Mode1或Mode2。即使在某种模式下,我也会根据事件的历史做某些事情
e.g。 如果我的显示器关闭,那么在模式1中,我采取的流量与显示器打开时的流量不同。并且显示通知异步到达,我没有明确查询该信息。
很少有其他类似的事件异步到达,可以改变我将采取的进一步行动的行动方案。
我试图了解如何存储与过去发生的这些事件相关的信息。我倾向于将它们存储为标志但是它失败了使用状态模式的目的(并且它也容易出错)。
我的另一个选择是将这些信息存储在状态本身,例如: Mode1_DisplayOff_Atrribx,Mode1_DisplayOff_Atrribx,Mode2_DisplayOff_Atrribx,Mode2_DisplayOff_Atrriby。但我担心这会使状态机复杂化。
这里应该采用什么方法?
(问题不一定与嵌入式系统有关)
答案 0 :(得分:0)
对于这种情况,或者对于具有复杂状态处理的任何情况,一些一般设计建议:
避免丛林的旗帜:你必须从众多来源收集旗帜已经够糟糕了。如果您还将此与本地决策者结合使用,则必须在整个程序中编写复杂的代码,本地决策者会在此处进行状态更改。很快就无法跟踪程序流程和代码覆盖率。
这也会导致许多模块之间的紧密耦合,这些模块可能彼此独立,这总是一件非常糟糕的事情。
你的主循环看起来像是:
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
是程序中仅的位置,其中允许发生状态更改。此函数仅关注下一个要执行的状态,它不执行任何实际工作。