gpt4 book ai didi

c++ - 嵌入式系统状态模式: Storing information related to asynchronous events

转载 作者:行者123 更新时间:2023-11-30 17:08:52 25 4
gpt4 key购买 nike

我有一个嵌入式系统软件,我在其中执行一系列硬件初始化步骤,然后根据发生的事件历史记录进入模式 1 或模式 2。即使在某种模式下,我也会根据事件的历史来做某些事情

例如如果我的显示器关闭,那么在模式 1 下,我采用的流程与显示器打开时采用的流程不同。并且显示通知异步到达,我没有显式查询该信息。

几乎没有其他类似的异步到达事件可以改变我将进一步采取的流程。

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

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

这里正确的方法应该是什么?

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

最佳答案

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

  • 总体设计建议:尽可能简单。力求简单,而不是复杂。

  • 创建一个与您拥有的“模式”、“事件”、“标志”等的组合数量相对应的状态机。这可以根据需要简单或高级 - 有时您可能需要实现子状态(例如在状态“错误”中,有子状态“错误显示”和“错误 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 是程序中允许发生状态更改的唯一位置。该函数只关心接下来要执行什么状态,并不执行任何实际工作。

关于c++ - 嵌入式系统状态模式: Storing information related to asynchronous events,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33491078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com