EFSM (Extended Finite State Machine) - 扩展有限状态机
扩展有限状态机模型是对有限机状态模型的一个扩展,它在FSM模型的基础上增加了变量、操作以及状态迁移的前置条件,可以更加精确的刻画软件系统的动态行为。
EFSM是一个六元组:M=(S, s0, V, I, O, T )
其中:
S 是一个有限状态集合
V 是内部变量的有限集合
I 是输入集合
O 是输出集合
T 是状态迁移的有限集合
T 的每个迁移 t 是一个六元组 T=(si, sj, at, ot, Pt, At)
si是迁移 t 的起始状态
sj是迁移 t 的终止状态
at∈I 是输入符
ot∈O 是输出符
Pt 是对当前变量值的谓词判定条件
At 是输出或赋值等一系列操作语句.
Pt 和At在部分文献中也分别被称作守卫(guard) 和行为(action)
若扩展有限状态机位于状态 si, 对应当前状态变量值为 xi, 当接受输入at或输入事件, 并且xi对于Pt是有效的, 也就是说 Pt(xi) = true, 则 M 触发迁移 t 并且状态转换为 sj。
在迁移发生过程中, At操作可能改变或输出状态 si的变量值, 也可能产生输出事件,路径中触发某些迁移的谓词条件可能为永真而有些谓词条件则较为复杂难以满足。
当一条路径中 2 个迁移上的行为和守卫之间存在矛盾, 不能找到满足谓词条件的输入时, 该路径被认为是不可行的。
事件驱动型有限状态机
EFSM(event finite state machine,事件驱动型有限状态机),是一个基于事件驱动的有限状态机,主要应用于嵌入式设备的软件系统中。
仓库:
有限状态机是一种用来进行对象行为建模的工具,其作用主要是描述对象在它的生命周期内所经历的状态序列,以及如何响应来自外界的各种事件。在计算机科学中,有限状态机被广泛用于建模应用行为、硬件电路系统设计、软件工程,编译器、网络协议、和计算与语言的研究。
一般状态机有两种写法:
- 竖着写:在状态中判断事件
- 横着写:在事件中判断状态
横竖两种写法实现的功能完全相同,但是,横着写的效果明显好于竖着写的效果
状态机不仅仅可以表示代码的逻辑层次和逻辑关系,还能很好的将源代码做到分离和区分,从而实现代码框架的时间与空间的隔离(逻辑与存储的分离),这才是状态机存在的真正价值和实际意义!
我们把每一个状态看成一个实际的对象,每个对象都会处理一组相同的事件,对于某个状态对象不关心的事件,只需要将对应的处理置位NULL即可!
状态机模式是一种行为模式,在《设计模式》这本书中对其有详细的描述,通过多态实现不同状态的调转行为的确是一种很好的方法,只可惜在嵌入式环境下,有时只能写纯C代码,并且还需要考虑代码的重入和多任务请求跳转等情形,因此实现起来着实需要一番考虑。
工控软件设计可分为基于控制环和基于实时操作系统两大类。
控制环是把各个功能模块连接成首尾相接的环状结构。其特点为任何一个功能模块都不能出现死循环,甚至循环次数太多的循环语句都应避免出现。以保证能够在实时意义上尽可能快地遍历各功能模块,从而满足实时多任务的需求。在各功能模块中一般用状态机来描述模块所处的状态。
而实时操作系统则可以通过一套底层机制根据优先级和各任务状态调度各功能模块。此时各功能模块就以“任务”作为表现形式。但是在每个任务内部仍然为一个独立的控制环结构,仍然需要用状态机描述。
有限状态机是一种重要的思想方法。从数学的角度看,它实际是一个五元组M = (I, O, S, δ, λ),其中I,O分别表示输入输出,S为状态向量,δ为次态方程(δ: S×I ->S), 表示输出方程(λ: S×I -> O)。
有限状态机从结构体系上有层级状态机,并发状态机等。
层级状态机类似于软件中的子程序调度:更高层的一个状态对应于较低层的一个状态机。这个高层的状态处于底层状态机的某个状态中。这个低层状态称为子状态。与子程序调用受到系统堆栈深度制约不一样,层级状态机可以由开发者根据控制对象的层次性运动规律任意指定深度。与子程序的目的一样,层级状态机也是为了提高控制软件的模块化程度,降低状态分析的复杂度。
并发状态机偏重于描述状态机的调度。状态机本身不能实现什么并发功能,并发的实现是通过软件调度的。如果把状态机理解成一个任务,那么就能理解并发的实现。在控制环中,一个“任务”就是一个功能模块,我们只需要把多个状态机串联在环中,也就是实现了多输入多输出的并发控制。此时,多个状态机在空间上是并存的,然而却是分时调用的,调用的周期等同于控制环扫描一周的时间。不过如果CPU运算速度足够快,这个周期将会足够的快,达到“实时”的程度,从而这多个状态机也就实现了“并发”运行。
同理,在多任务操作系统中,“并发”的实现就更容易理解了,除了在单个任务内存在控制环的并发控制外,在任务之间也同样存在多状态机的并发运行。当然,从CPU的角度而言,只要是单核的,也就从来不存在真正的“并发”,它在任何一个特定的时间点都只能处理某个特定状态机。不过多任务操作系统却提供了一套底层机制来调度原来仅靠控制环来调度的任务。
工控软件本质上是根据一定的逻辑条件给出有序的输出。根据输出的次序可以划分不同的状态。逻辑条件在嵌入式领域中就是用户的输入和传感器的状态。