程序小白
认证:优质创作者
所在专题目录 查看专题
【第十篇】QF框架之事件管理——事件派发机制
【第十一篇】QF框架之事件管理——事件内存(上)
【第十二篇】QF框架之事件管理——事件内存(中)
【第十三篇】QF框架之事件管理——事件内存(下)
【第十四篇】QP移植与配置
【第十五篇】利用QM逆向分析ship活动对象
作者动态 更多
小小调度器——开局default,优雅总藏于细节之中
04-02 09:23
小小调度器——调度器核心的纯C实现
04-01 14:09
小小调度器——原来C代码还能这么写,原作者没少挨打吧!
03-27 15:42
解析由系统库引发的hardfault血案(RT-Thread+ESP32)
2023-07-17 16:04
TINA瞬时现象仿真分析——运放缓冲器振铃
2023-02-28 11:38

【第十五篇】利用QM逆向分析ship活动对象

      实际开发过程中,是利用QM工具构架状态图,并生成活动对象源码,在这里我们通过逆向的角度,已经有了ship活动对象源码的情况下,来分析一下他来自于QM的哪个部分,最后我们自建一个qm的工程一步一步添加代码,生成整个工程。

      这完整的QM工程和由QM工程所生成的源码文件对比如下:

      活动对象的底层原型就是一个状态机:QActive 就是 QHsm~!

      对于状态机由两部分组成:内部成员和状态图。

      内部成员构成类比于对象的属性:

        状态图主要描述状态的迁移以及对不同状态对于相同事件,

        做出不同的反应,核心在于状态的分析:

      有了状态的分析,接下来看一下那些触发转换的事件,初始转换已经在上图中标出,这里  不再重复,所有带箭头的折线代表着转换,而每个转换皆有事件触发:

      事件的作用一部分是用来触发状态转换,另一部分用于状态内部处理,并不触发状态转换:

       借助QM构建工具,让ship状态机的流程变得更加的清晰,其实大部分的代码都是由QM工具帮我们生成的,这并不带代表着QM能够自动生成所有的代码细节,而是帮我们搭好了状态机的框架,利用框架进行代码定位更加清晰。

      基于QM从零开始构建ship活动对象:

创建一个.C文件,输入独特的命令行:$declare${AOs::Ship}

点击执行生成代码:

    打开你QM的工程目录,然后对比一下QM工程中状态机的样子,一个是图形化样子,一个是完全可以执行的代码。

    接着输入命令展开状态机定义$define${AOs::Ship}:

     此外状态机还需要一个给外部框架调用运行的指针,他是一个QActive类型的通用指针,需要单独定义及变换。

      要启动一个状态机之前,除了拥有了其通用活动对象指针以外,还需要一个构造函数:

     真正要让这个状态机跑起来,就需要在main函数中,调用构造函数对其进行构造,并调用框架提供的START函数,让他真正的运行起来:

       到这里关于QM与活动对象Ship之间的爱恨纠葛就结束了,一个应用需要多个活动对象协调运转,后面不会展开这么细致的去分析QM与活动对象, 而是站在QM的角度来看待整个应用,他或许是一扇新的窗,希望会有阳光。

声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
觉得内容不错的朋友,别忘了一键三连哦!
赞 3
收藏 3
关注 115
成为作者 赚取收益
全部留言
0/200
成为第一个和作者交流的人吧