表驱动的二级状态机实现

关于这篇文章

  针对看了好几篇关于状态机的文章,然后自己动手操作写了两个程序,这是第二个,上一个程序是关于一级状态机的,我选的那个场景不错,也可以修改成二级状态机实现。

  一级状态机和二级状态机的区别是:二级状态机在一级状态机的基础上添加了很多子状态,(子状态共同拥有上级父状态的某些共性,又各自拥有自己的一些共性)。状态表需要分为两级。

image-20210227135008055

  这只是网上找的一个能说明二级状态机的一个图片,实现的场景和这个无关,而是简化了的进程管理,严格来说是我看了公众号文章什么是状态机之后,觉得它查找StateInfo的方式是switch…case的,这种如果后期需求改动还需要“动”程序逻辑,不太好,于是自己想办法改成了表驱动的。

  看过表驱动的一级状态机实现指针数组 这两篇文章的小伙伴应该已经知道我写的这二级状态机是怎么实现的了,测试程序逻辑的main函数也和一级状态机的大同小异。

  程序的文件结构如下,程序源码下载stateMachine2.zip

image-20210227182750402

关于二级状态机实现了解

  参考的公众号文章什么是状态机,建议细细阅读,比我这种没写几句直接贴代码的强太多了,我也想写得像他一样,能力还是其次,首先是时间不允许呀。写文章的目的也不一样,人家是分享知识,我是分享知识学习后的所得。

程序运行结果

image-20210227140828992

main函数测试代码

int main(void)
{
   
    StateMachine SM_Type;
    state_machine_regist(&SM_Type, StateTable);
    SM_Type.currentState = sta_origin;
    SM_Type.stateTableNum = sizeof(StateTable) / sizeof(StateTable[0]);

    printf("init state: %s \n\n", comparison_table[SM_Type.currentState].str);

    runStateMachine(&SM_Type, evt_fork);
    printf("current state: %s \n\n", comparison_table[SM_Type.currentState].str);

    runStateMachine(&SM_Type, evt_sched);
    printf("current state: %s \n\n", comparison_table[SM_Type.currentState].str);

    runStateMachine(&SM_Type, evt_sched);
    printf("current state: %s \n\n", comparison_table[SM_Type.currentState].str);

    runStateMachine(&SM_Type, evt_wait);
    printf("current state: %s \n\n", comparison_table[SM_Type.currentState].str);

    runStateMachine(&SM_Type, evt_wake);

    printf("final state: %s \n\n", comparison_table[SM_Type.currentState].str);

    return 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值