嵌入式系统状态模式:存储与异步事件相关的信息

时间:2015-11-03 03:50:51

标签: c++ c design-patterns embedded

我有一个嵌入式系统软件,我会经历一系列硬件初始化步骤,然后根据发生的事件的历史记录转到Mode1或Mode2。即使在某种模式下,我也会根据事件的历史做某些事情

e.g。 如果我的显示器关闭,那么在模式1中,我采取的流量与显示器打开时的流量不同。并且显示通知异步到达,我没有明确查询该信息。

很少有其他类似的事件异步到达,可以改变我将采取的进一步行动的行动方案。

我试图了解如何存储与过去发生的这些事件相关的信息。我倾向于将它们存储为标志但是它失败了使用状态模式的目的(并且它也容易出错)。

我的另一个选择是将这些信息存储在状态本身,例如: Mode1_DisplayOff_Atrribx,Mode1_DisplayOff_Atrribx,Mode2_DisplayOff_Atrribx,Mode2_DisplayOff_Atrriby。但我担心这会使状态机复杂化。

这里应该采用什么方法?

(问题不一定与嵌入式系统有关)

1 个答案:

答案 0 :(得分:0)

对于这种情况,或者对于具有复杂状态处理的任何情况,一些一般设计建议:

  • 总体设计建议:尽量保持简洁。力求简单,而不是复杂。
  • 创建一个状态机,对应于您拥有的“模式”,“事件”,“标志”等组合的数量。这可以根据需要简单或高级 - 有时你可能需要实现子状态(例如在状态“错误”中,有子状态“错误显示”和“错误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是程序中的位置,其中允许发生状态更改。此函数仅关注下一个要执行的状态,它不执行任何实际工作。