嵌入式系统中状态机的应用

时间:2024-03-26 16:41:36

某项目中在业务逻辑的处理过程中需要处理多种的中断信号,导致逻辑部分的代码被搞得支离破碎。一直在想有没有好点的,漂亮一点的方法。这次在一个后续的项目中真好有一个重写这部分代码的机会,就拿它开开刀,拉出来练练。

1.分离逻辑处理和中断处理

在原来的实现中因为没有区分处理的原有逻辑和中断逻辑,才导致到处都是大段大段的if/else的。所以上来就将处理逻辑和中断逻辑砍开:

・处理逻辑:在理想状态下的处理逻辑,针对指定信息源作解析处理。

・中断逻辑:针对特殊事件,每个部件所需要采取的处理。

2.抽出处理逻辑中状态

分离出中断逻辑就简单了,很容易的就发现原有的系统中复杂的原因所在,需要在逻辑处理的不同状态下,处理各种中断。

分析各种逻辑,最后得出三种状态机模型:

 ・一状态状态机:它只有一个状态,只有一个状态那不是什么判断都没有。它其实是只响应中断的处理。

 ・两状态状态机:它有两个状态,可以描述基于一个阈值的判断。也可以说成“只要那个啥,啥啥了,就啥啥啥。”。

 ・三状态状态机:它有三个状态,可以描述基于两个阈值的判断。也可以说成“只要那个啥1,啥啥1了,再那个啥2,也啥啥2了,就啥啥啥。”。

啥多了不行,还得整点图。

2.1 一状态的状态机

嵌入式系统中状态机的应用

确实啥也不干,就指望着中断来点啥了。

2.2 两状态状态机

嵌入式系统中状态机的应用

这个好点,判断一个阈值就行了。

2.3 三状态状态机

嵌入式系统中状态机的应用

两个阈值的判断。

也不咋地啊,最多也就2个条件,3个状态,4个中断,其实也就12种状态,但是硬是差点没搞明白。

3.实现

模型出来了,抽一下共同就变成下面这个样了

嵌入式系统中状态机的应用

两个接口:

・Interruptable:封装各种中断的入口

・Logic:封装逻辑的接口,包含中断接口

状态机的实现:

・State:描述各个状态,并提供此状态下的中断接口

・StateMachine:封装状态迁移的逻辑,开放各种状态迁移时的接口。所有中断直接扔给当前状态。

下面是各个模型的共同化

・一状态状态机就一个实现没共同化

・LogicWitch2State:封装了2个状态,并提供各个业务的接口。

・LogicWitch3State:封装了3个状态,并提供各个业务的接口。

再下面就是各个具体的实现了

4.总结

搞完了就想,图个啥啦?本来直接实现就行了,这么一整就活活多出来2个接口和4各类。整地呼哧呼哧的,图啥啦?

想来想去也就图个容易理解。虽然咱IT这行主要是为了让计算机帮咱们干点活,只要计算机明白了其实也就行了。但是在现实中,客户都是善变的,往往一个东西总是要翻来覆去的修改,还经常换着人去改。如果人不容易理解,就计算机明白的话,那后来的人也还要再痛苦一遍。而搞个好点的模式就方便了,容易懂,容易讲,忘了再看一下就明白了。