关于这篇文章
针对看了好几篇关于状态机的文章,然后自己动手操作写了两个程序,这是第二个,上一个程序是关于一级状态机的,我选的那个场景不错,也可以修改成二级状态机实现。
一级状态机和二级状态机的区别是:二级状态机在一级状态机的基础上添加了很多子状态,(子状态共同拥有上级父状态的某些共性,又各自拥有自己的一些共性)。状态表需要分为两级。
这只是网上找的一个能说明二级状态机的一个图片,实现的场景和这个无关,而是简化了的进程管理,严格来说是我看了公众号文章什么是状态机之后,觉得它查找StateInfo的方式是switch…case的,这种如果后期需求改动还需要“动”程序逻辑,不太好,于是自己想办法改成了表驱动的。
看过表驱动的一级状态机实现 和 指针数组 这两篇文章的小伙伴应该已经知道我写的这二级状态机是怎么实现的了,测试程序逻辑的main函数也和一级状态机的大同小异。
程序的文件结构如下,程序源码下载stateMachine2.zip
关于二级状态机实现了解
参考的公众号文章什么是状态机,建议细细阅读,比我这种没写几句直接贴代码的强太多了,我也想写得像他一样,能力还是其次,首先是时间不允许呀。写文章的目的也不一样,人家是分享知识,我是分享知识学习后的所得。
程序运行结果
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