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

Embedded System State Pattern: Storing information related to asynchronous events

本文关键字:事件 信息 异步 状态 系统 模式 存储 嵌入式      更新时间:2023-10-16

我有一个嵌入式系统软件,在那里我完成了一系列硬件初始化步骤,然后根据发生的事件的历史转到模式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是程序中允许发生状态更改的唯一位置。这个函数只关心下一步执行什么状态,不执行任何实际工作。