文章目录
一、什么是有限状态机
1.1 有限状态机的定义
有限状态机(FSM: Finite-state machine)是一种用来进行对象行为建模的工具,其作用主要是描述对象在它的生命周期内所经历的状态序列,以及如何响应来自外界的各种事件。它把复杂的控制逻辑分解成有限个稳定状态,在每个状态上判断事件,变连续处理为离散数字处理,符合计算机的工作特点。同时,因为有限状态机具有有限个状态,所以可以在实际的工程上实现。但这并不意味着其只能进行有限次的处理,相反,有限状态机是闭环系统,有限无穷,可以用有限的状态,处理无穷的事务。在计算机科学中,有限状态机被广泛用于建模应用行为、硬件电路系统设计、软件工程,编译器、网络协议、和计算与语言的研究。
1.2 有限状态机的要素
根据有限状态机的定义,可以提炼出几个构成要素,首先是被分解为有限个当前状态,在每个状态上判断事件是否发生,外界事件触发后的响应动作,事件响应后的状态迁移等四个要素。
下面用一个图示和一个数据结构分别描述一个状态机单元:
typedef struct FsmTable_s
{
uint8_t event; /* 触发事件 */
uint8_t CurState; /* 当前状态 */
void (*eventActFun)(void *); /* 动作函数 */
uint8_t NextState; /* 跳转状态 */
}FsmTable_T;
1.3 有限状态机的C语言实现
前面用一个结构体FsmTable_s描述一个当前状态及其触发事件、动作函数和跳转状态等。如果要描述该状态机所有的状态,则可以将每个状态以数组或链表的形式组织起来,考虑到数组较简单且我们需要时刻直到当前所处的状态,故再用一个结构体表示一个状态机如下:
typedef struct FSM_s
{
FsmTable_T *FsmTable; /* 状态迁移表 */
uint8_t curState; /* 状态机当前状态 */
uint8_t stuMaxNum; /* 状态机状态迁移数量 */
}FSM_T;
该结构体中一个指针配合一个状态数量构成一个状态数组,再加上当前状态便可描述该状态机的所有状态及当前所处的状态。
由前面状态机的定义可知,状态机是由事件驱动的,我们拿到一个状态机首先要了解其有哪些状态、当前处于哪个状态,其次要清楚当前状态有事件触发时如何响应,所以状态机的实现最重要的是状态机的初始化和事件响应。前面已经给出了描述状态机的数据结构,下面给出状态机的初始化函数与事件响应函数如下:
/*==================================================================
* Function : FSM_Init
* Description : 状态机初始化
* Input Para : pFsm状态机对象,pTable状态迁移表,stuMaxNum迁移表数量
* curState当前状态
* Output Para :
* Return Value:
==================================================================*/
void FSM_Init(FSM_T *pFsm, FsmTable_T *pTable, uint8_t stuMaxNum, uint8_t curState)
{
pFsm->FsmTable = pTable;
pFsm->curState = curState;
pFsm->stuMaxNum = stuMaxNum;
}
/*==================================================================
* Function : FSM_EventHandle
* Description : 状态机处理函数
* Input Para : pFsm状态机对象, event触发事件, parm动作执行参数
* Output Para :
* Return Value:
==================================================================*/
void FSM_EventHandle(FSM_T *pFsm, uint8_t event, void *parm)
{
FsmTable_T *pAcTable = pFsm->FsmTable