技术系列之 状态机(二)

本文继续探讨状态机的设计,重点介绍面向过程的层次状态机实现。层次状态机通过FSM_STATE结构增加了parent和default_child字段,用于处理事件。在事件处理算法中,它遍历当前状态及其祖先状态寻找匹配事件,并执行相应的exit_func和enter_func。文章提供了一个简单的状态机初始化和状态表示例,并预告了面向对象方式、状态机分析、回路检测及使用等内容。
摘要由CSDN通过智能技术生成

上接《系统设计之 状态机(一)》
三、状态机实现
(2)面向过程方式
2、层次状态机模块实现。与常规状态机相比,它的FSM_STATE结构没有default_func,多了 FSM_STATE_ID parent; FSM_STATE_ID default_child;两个结构。状态机初始化的时候可以指定默认状态,为了防止指定的状态非叶结点,增加fsm_init方法。该状态机的事件处理算法简单描述如下:(1)首先在当前状态以及其祖先状态的状态事件表中搜索匹配事件,如果搜索到,保存操作以及目的状态标识;(2)在old栈中保存当前状态到根节点的路径,在new栈中保存目的状态到根节点的路径;(3)将old栈中的顶层元素依次与new栈的顶层元素匹配,如果匹配则都出栈,不匹配,停止;(4)当前的old栈中节点即为该事件导致的退出状态,从栈低扫描到栈顶,依次执行exit_func;(5)执行以前保存的操作;(6)扫描new栈,从栈顶到栈低依次执行enter_func;(7)最后检测目的状态是否是叶节点状态,否,则依次进入default_child节点,并执行enter_func。模块实现代码如下:

#define SINGLE_STATE_MAX_EVENT  10
#define STATE_TREE_DEPTH 
10
typedef  
int  FSM_EVENT_ID;
typedef struct event_param_st
{
    FSM_EVENT_ID id;
    union
{
        
int i;
    }
data;
}
FSM_EVENT;
typedef  
int  FSM_STATE_ID;
typedef 
void  ( * FSM_FUNC)(FSM_EVENT  * );
typedef struct state_event_st
{
    FSM_FUNC func;
    FSM_EVENT_ID event;
    FSM_STATE_ID state;
}
FSM_STATE_EVENT;
typedef struct state_st
{
    FSM_STATE_ID id;
    
char *name;
    FSM_STATE_ID parent;
    FSM_STATE_ID default_child;
    FSM_FUNC enter_func;
    FSM_FUNC exit_func;
    FSM_STATE_EVENT event_table[SINGLE_STATE_MAX_EVENT]; 
}
FSM_STATE;
typedef FSM_STATE STATE_TABLE[];
typedef FSM_STATE 
*  PTR_STATE_TABLE;

#define END_EVENT_ID 
- 1
#define END_STATE_ID 
- 1
#define BEGIN_FSM_STATE_TABLE(state_stable) 
static  STATE_TABLE state_stable = {
#define BEGIN_STATE(id,name,parent,default_child,enter_func,exit_func) 
{id,name,parent,default_child,enter_func,exit_func,{
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值