[
](https://blog.csdn.net/qq_31418645/article/details/80171806)
- 量子平台(Quantum Platform, 简称QP)是一个用于实时嵌入式系统的软件框架,QP是轻量级的、开源的、基于层次式状态机的、事件驱动的平台。
- QP包括事件处理器(QEP)、轻量级的事件驱动框架(QF)、任务调度微内核(QK)和实时跟踪调试器(QS)四个部分。
事件处理器QEP
- QEP的核心思想就是,用一个函数指针指向当前状态函数,使用这个函数指针有条件地执行某状态函数,并根据执行结果执行其它的相应动作。
在QP中用函数表示状态,叫状态函数,一个状态用一个状态函数表示,系统有多个状态,也就可以用多个函数来表示。在QEP中定义了一个状态函数指针QStateHandler,用这个函数指针可以指向任何一个状态函数。在状态函数内使用了结构清晰的switch—-case语句,对不同的事件(信号)进行分类处理。
typedef QState (*QStateHandler)(void *me, QEvent const *e); /*状态函数指针,指向状态机中任何一个状态函数*/
- QState是调用状态函数的返回值
- 有四种返回值:
- 0—-QRETHANDLED,表示事件被处理了,但没有转换,叫内部转换;
- 1—-QRETIGNORED, 表示事件被忽略,没有处理;
- 2—-QRETTRAN,表示事件被处理了,并有转换,转换到其它状态;
- 3—-QRETSUPER,表示进入父状态了,只用于层次状态机HSM中
- 平面状态机FSM或层次状态机HSM内部定义了一个QStateHandler类型的state变量,它是一个指向状态函数的指针,state指向哪个状态函数,哪个状态函数就是当前状态,有事件时,总是把事件发给当前状态的状态函数来处理。状态机有多个状态,但同一时刻,只有一个“焦点”(当前状态),“焦点”可以用QTRAN(target)来改变。
- 事件处理器,也可以理解为一个状态机引擎,当处理有事件时,调用当前状态的状态函数处理这个事件,并处理调用状态函数的返回值,根据返回值进行相应的状态变换(如转移到父状态)。
- 同时状态引擎也处理状态的进入(ENTER)、退出(EXIT),并处理初始伪状态。
事件处理器利用状态函数指针来调用状态函数,总是把事件发送到当前状态,但事件不是在当前状态处理了,由调用的结果来判断。
轻量级事件驱动框架QF
QF回调函数
回调函数,指的是需要被QF框架调用,但并不是在QF框架内部实现的函数。这些函数的实现与硬件相关性很大,需要在BSP中实现。
任务调度微内核QK
实时跟踪调试器QS
不要使用分散的C或C++语句来思考,而应该使用状态机元素比如状态,转换,进入/退出动作,初始转换,和监护条件来思考。当你的思维有了这个量子跃迁,你将不会和令人费解的“意大利面条”代码作斗争。你将开始在一个较高的抽象层来思考,用最好的方法把行为分区到各个状态,在任何给定时间有哪些可用时间,以及记得状态机的最优化的状态层次。
[
](https://blog.csdn.net/qq_31418645/article/details/80171806)
一个事件是一类瞬间发生的能导致状态机去执行动作的事情。事件可以有参数,参数可以携带关于这个已发生事情的定量化的信息。当接收到一个事件的实例,状态机通过完成动作(执行代码)来响应。响应也许包括改变状态,这被称为一个状态转换。
状态机的基本实现方式:
a) 嵌套的switch 语句
b) 状态表
c) 面向对象的状态设计模式
d) 目的:消除判断语句
过程总结如下:
1.头文件定义;
2.事件队列的声明;
3.事件池的声明;
4.发行-订阅事件存储空间的声明;
4.主动对象的初始化;
5.硬件初始化;
6.QF初始化;
7.事件池初始化;
8.发行-订阅机制的初始化;
9.启动活动对象线程;
10.将控制权交给QP,运行状态机;
- 着重于讲解如何使用QM来绘制状态机图,现代分层状态机(HSMs)的一些优势,以及如何通过状态机生成状态机代码
- QM是一个免费软件,是基于模型的设计(MBD)和自动代码生成工具,用于基于分层状态机(UML状态图)和事件驱动的实时嵌入式软件以及实时嵌入式框架(RTEF)。
- QM为现代分层状态机(HSMs)(UML状态图)提供了一个完美的平台,也是构造事件驱动系统最有效、最优雅的技术,可以说QM是专门为简化(HSMs)绘制以及高效的从中生成具有生产质量的代码而专门设计的。
- (HSMs)与经典有限状态机(FSM)相比,最重要的优势就是分层状态嵌套,这样避免了重复,这在传统的有限状态机FSM中是不可避免的,也是FSM中状态转换繁琐的主要原因。状态嵌套的意思其实就是允许子状态仅定义行为与超状态的差异,从而促进状态共享和状态与事件的复用。