程序小白
认证:优质创作者
所在专题目录 查看专题
【第二章】HSM层次式状态机理论(进阶版)
【第三章】有限状态机(FSM)之炸弹项目(实战1)
【第四章】有限状态机(FSM)之炸弹项目(实战2)
【第五章】有限状态机(FSM)之炸弹项目(实战3)
【第六章】层次式状态机HSM = 有限状态机FSM + 面向对象
【第七章】如何创建基于HSM状态机的应用
作者动态 更多
电子元器件那些事儿:三极管工作区的判断如此简单①
1星期前
RT-Thread驱动之路:stm32设备驱动开发之SPI原理①
2星期前
RT-Thread驱动之路:stm32设备驱动开发之浅析注册机制⑤
2星期前
RT-Thread驱动之路:stm32设备驱动开发之uart中断处理④
3星期前
电子元器件那些事儿:继电器电路驱动设计②
3星期前

【第七章】如何创建基于HSM状态机的应用

      如何创建一个状态机的应用程序,是比较简单的,如果把你的应用程序改造成状态机是比较困难的,换个说法,如何把应用程序优雅的用状态机实现,这有点考验你对项目需求和状态机两方面的理解能力。这一篇我们只讲把一个简单的应用编程一个状态机应用程序。

      第一步,就是枚举信号,也就是整个状态机应用里面用到的所有信号都枚举出来。如下:

     

      注意下,第一个信号A_SIG 的默认值是Q_USER_SIG,也就是说他是第一个Q_USER_SIG信号,而状态机本身是有几个被默认信号的,Q_ENTRY_SIG/Q_EXIT_SIG/Q_INIT_SIG,这几个默认的信号已经在QEP处理器中被事先定义好了:

      第二步,定义事件类型,QEP有默认的事件类型,叫QEvt,他只提供一个最简单的类型,或者说是事件处理器需要的类型,实际应用中你可能需要一个事件带有其它的参数,这时候你需要继承QEP的默认事件来创建你的事件类型。这两种情况给出官方定义的两种事件类型的例子如下:

      第三步、派生状态机类型,这个词在C++中用来还是比较合适,针对C来讲,我们暂且称之为定义状态机类型。

      第四步、声明状态处理函数。

      第五步、实例化一个特定状态机对象、以及实例化一个通用状态机全局指针。

      第六步、构造状态机、类似于C++中的构造函数。

      第七步、定义状态处理函数。

      到这里应该没有遗漏的了,关于状态机相关的内容编码就完毕了,下面就是要真正的让状态机跑起来,你需要在main函数中进行一些操作,让这个状态机真正的运行起来,针对事件驱动型系统来讲,状态机本身是被动的,他不会主动进行任何操作,他需要事件处理器进行分发事件,然后根据分发的事件触发状态处理或转换。

      关于如何让状态机运行起来,我们需要在main函数中进行一下操作,还是拿这个例程为模板进行说明吧。

      第一步、显式调用ctor函数,构造状态机。

      第二步、显式调用init函数,初始化状态机。

      第三步、采集输入信号、构造事件对象、调用事件处理器,将相应的事件发送给状态机。

以上步骤就完成了一个单一状态机的编码及应用。

声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
觉得内容不错的朋友,别忘了一键三连哦!
赞 7
收藏 8
关注 135
成为作者 赚取收益
全部留言
0/200
  • RTX51 2021-07-14 20:41
    您好,请发一下状态机专题的源码,谢谢 517016995@qq.com
    回复 3条回复