1.QP简介:

量子平台(Quantum Platform, 简称QP)是一个用于实时嵌入式系统的软件框架,QP是轻量级的、开源的、基于层次式状态机的、事件驱动的平台。

QP包括事件处理器(QEP)、轻量级的事件驱动框架(QF)、任务调度微内核(QK)和实时跟踪调试器(QS)四个部分。

利用QP可以开发出结构清晰的嵌入式应用程序(使用C或C++语言)。

图1.QP总体结构

2.QP之QF简介

QF是QP的核心,可以把QF理解为软件总线(software bus,SBus)。在这个软件总线上连接着很多的AO和硬件中断服务程序ISR,QF负责事件的存贮、分发和回收等功能,也就是事件驱动。

QF是一个事件驱动框架。应用程序可以创建事件实例,放到事件池中,并分发事件到相应注册了这个事件的活动对象(状态机,任务)AO中。应用程序可以注册特定的事件,当有事件发生时,QF就会分发事件到AO中。应用程序是由多个AO组成,每个AO可以认为是一个任务。把硬件中断程序也当做AO看待,只是优先级比较高。

QF量子框架由五个数据结构及操作组成,其数据结构采用了uCOS-II相似的结构。


图2.细化的QF总体结构

3.QF分发事件

如图 1所示,QF是个软件总线,在这个软件总线上连接着AO和ISR。QF中包含5个主要的数据结构(受uCOS II影响很深,要看一下uCOS II内核)。

有两种事件的分发方式:

(1)直接分发事件

一个AO直接分发事件到另一个AO,就是直接投递事件。这种方式分发事件的AO要知道目标AO。

使用void QActive_postFIFO(QActive *me, QEvent const *e) 函数分发事件。

(2)P/S分发事件

利用QF中的AO订阅事件表,以P/S(Publish-Subscribe出版-订阅)方式分发事件,也就是P/S投递事件。 这种方式分发事件AO不用知道目标AO,QF查找AO订阅事件表就知道把事件分发到什么地方。P/S投递方式减少了AO之间的耦合度。

使用void QF_publish(QEvent const *e)函数分发事件。


图3.QF软件总线和两种投递事件方式

框架QF包括活动对象AO,每个AO包含一个AO队列(QEQueue)和状态机。QF中还有5个主要的数据结构表,其中有3个AO相关的数据结构:AO订阅事件表,AO队列状态表,AO注册表;有1个事件池QMPool,用于保存事件实例,其它事件都是对这个事件实例的引用;有1个时间事件链表QtimeEvt,用于定时事件处理。图 2是相应数据表与QF和AO的关系。


图4.QF框架及五个数据表

4.QF运行

QF运行时,包括的过程有:
(1)QF初始化;
(2)AO和ISR产生事件;
(3)分发事件到AO队列;
(4)循环调度分派事件到状态机。
在把事件放到AO队列中时,会置位AO队列状态表相应位;从AO队列中取出事件时,会清零AO队列状态表相应位。总之,放事件到AO队列或从AO队列取事件,都会修改AO队列状态表。


图5.QF运行过程及数据表关系

(1)QF初始化
在QF运行之前,首先要进行初始化,要创建AO、创建事件池、创建AO订阅事件表,创建AO队列等一系统开始工作。


图6.QF初始化

(2)AO和ISR产生事件
在AO或ISR中,用Q_NEW()宏可以创建用户事件实例,并放到事件池中。
如用 UserEvt *pe = Q_NEW(UserEvt , UserSig1)
创建了一个用户事件pe。可以分发这个用户事件pe到AO队列中。

其中,UserEvt是增加了参数的用户自定义事件,它是继承自QEvent,UserEvt定义如下,

typedef struct UserEvtTag {
QEvent
super; /
继承自QEvent /
uint8_t parameter;/
增加的事件参数 /
} UserEvt;

UserSig1是用户定义的信号,用枚举来定义,定义如下,

enum UserSignals {
User1SIG = QUSER_SIG,/
用户定义第一个信号 /
User2_SIG, /
第二个信号 /
User3_SIG, /
第三个信号 /
...

/ 其它信号 /
};

(3)分发事件到AO队列

可以用QActive_postFIFO(TargetAO, (QEvent *)pe)直接分发事件或用QF_publish((QEvent *)pe)间接分发事件到目标AO队列中。使用直接分发事件方式时,不需要AO订阅事件表QF_subscrList的参与,而间接分发事件时要用到AO订阅事件表。

这两种分发事件都会修改AO队列状态表QF_readySet_(QK中,用QK_readySet),置位相应位,而在Vanilla调度或QK调度会清除AO队列状态表相应位。

(4)循环调度分派事件到状态机
- 有两种调度方式,一种是超级循环调度Vanilla方式,这种方式的任务是非抢占式的;
- 另一种方式是QK调度方式,QK是一个微调度内核,这种方式任务是抢占式的。

两种调度方式的流程:


图7.Vanilla调度流程


图8.QK调度流程

5.总结

QF是一个框架,用于事件的产生、保存、分发事件。有两种事件分发方式,并支持两种对任务的调度方式;可以理解QF为一个软件总线,其上安装了很多的AO和ISR。最多可以支持63个AO+ISR。

参考:
【1】QP量子平台、量子编程:http://www.state-machine.com

QP之QF原理的更多相关文章

  1. QP之QEP原理

    1.QP简介: 量子平台(Quantum Platform, 简称QP)是一个用于实时嵌入式系统的软件框架,QP是轻量级的.开源的.基于层次式状态机的.事件驱动的平台. QP包括事件处理器(QEP). ...

  2. QP之QK原理

    QK是一个很小的抢占式微内核调度程序,它专用用QP中. QK的思想源于SST,Miro Samek重写了自己前期编的SST(Super Simple Task)代码. QK循环查询AO队列的状态表QK ...

  3. Linux 远程登录——(九)

    Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Definitions */ table.MsoNormalTable ...

  4. QF——iOS程序运行原理(APP的生命周期)

    iOS程序的运行原理: main.m: 1. main.m 主函数是所有程序的入口函数. 2. 在main函数里是UIApplicationMain函数,开启了一个无限循环,以监听该应用. 该UIAp ...

  5. QF——OC的多态,动态绑定及实现原理

    多态: 封装,继承,多态是面向对象的三大特征. 那多态到底是什么呢? 多态:允许不同的类定义相同的方法,OC能自己判断当前类所对应的方法,不会混乱. 动态类型:程序直到运行时才确定对象的类型. 动态绑 ...

  6. java web学习总结(十四) -------------------JSP原理

    一.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写h ...

  7. javaweb学习总结(十四)——JSP原理

    一.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写h ...

  8. java web 学习十四(JSP原理)

    一.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写h ...

  9. javaWeb学习总结(8)- JSP原理

    一.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写h ...

随机推荐

  1. Not able to find Java executable or version转载

    转载地址:https://blog.csdn.net/qq_40902122/article/details/79437991 findstr' 不是内部或外部命令,也不是可运行的程序或批处理文件.N ...

  2. matlab中repmat函数的用法(堆叠矩阵)

    matlab中repmat函数的用法 B = repmat(A,m,n) B = repmat(A,[m n]) B = repmat(A,[m n p...]) 这是一个处理大矩阵且内容有重复时使用 ...

  3. JDBC操作数据库的基本步骤:

    JDBC操作数据库的基本步骤: 1)加载(注册)数据库驱动(到JVM). 2)建立(获取)数据库连接. 3)创建(获取)数据库操作对象. 4)定义操作的SQL语句. 5)执行数据库操作. 6)获取并操 ...

  4. Browser进程和浏览器内核(Renderer进程)的通信过程

    看到这里,首先,应该对浏览器内的进程和线程都有一定理解了,那么接下来,再谈谈浏览器的Browser进程(控制进程)是如何和内核通信的, 这点也理解后,就可以将这部分的知识串联起来,从头到尾有一个完整的 ...

  5. meat标签使用

    meta是html语言head区的一个辅助性标签.几乎所有的网页里,我们可以看到类似下面这段的html代码: <head> <meta http-equiv="conten ...

  6. linux命令之添加删除磁盘分区

    之前已经写过df和fdisk的区别了,df可以显示当前已经挂载的磁盘分区,df -T可以额外显示文件系统类型 fdisk -l可以显示出所有挂载未挂载的分区,但不显示文件类型 在我的虚拟机上有一块分配 ...

  7. JVM原理:4 运行期优化

    JVM运行期优化 Java程序在运行的期间,可能会有某个方法或者代码块的运行特别频繁时,就会把这些代码认定为“热点代码”.为了提高热点代码的执行效率,在运行时JVM会将这些代码编译成与本地平台相关的机 ...

  8. TSP 遗传算法

    GA——遗传算法 同模拟退火算法一样,都是现代优化算法之一.模拟退火是在一定接受程度的情况下仍然接受一个比较差的解. 遗传算法,是真真正正的和大自然的遗传进化有着非常紧密的联系的,当然遗传进化的只是在 ...

  9. 常用PowerShell命令

    查看版本: 文件重命名: 别名查看: 当前路径:(别名pwd) 切换路径:(别名cd) 子列表:(别名ls  -Force可查看隐藏项) 查看用户:(可显示隐藏) 资源管理器打开当前目录:(cmd亦可 ...

  10. Java之生成条形码、PDF、HTML

    关于Java生成HTML,可参考我的这篇文章:FreeMarker之根据模型生成HTML代码 当然了,该篇文章也会给你很多启发,比如,根据html生成html,大家不要小看这个,著名的WordPres ...