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. 关于httpclient的终结

    End of life 关于Commons HttpClient项目现在已经结束,不再开发.它已经被HttpClient和HttpCore模块中的ApacheHttpComponents项目所取代,新 ...

  2. LDA概率图模型之贝叶斯理解

    贝叶斯.概率分布与机器学习 转自:http://www.cnblogs.com/LeftNotEasy/archive/2010/09/27/1837163.html  本文由LeftNotEasy原 ...

  3. java面试题之----HashMap常见面试题总结

    “你用过HashMap吗?” “什么是HashMap?你为什么用到它?” 几乎每个人都会回答“是的”,然后回答HashMap的一些特性,譬如HashMap可以接受null键值和值,而Hashtable ...

  4. nginx配置+uwsgi+负载均衡配置

    nginx静态文件配置 location /static{ alias /var/www/myApp/static; } sudo mkdir -vp /var/www/myApp/static/ s ...

  5. Extjs 自动列宽

    //auto column width Ext.grid.Panel.prototype.viewConfig = { listeners: { refresh: function (dataview ...

  6. Selenium2学习(十四)-- 加载Firefox配置

    前言有小伙伴在用脚本启动浏览器时候发现原来下载的插件不见了,无法用firebug在打开的页面上继续定位页面元素,调试起来不方便 . 加载浏览器配置,需要用FirefoxProfile(profile_ ...

  7. P2PSearcher云点播设置和使用技巧

    P2PSearcher是一款基于ED2K网络的资源搜索工具,资源丰富,小巧轻便.资源搜索结果最丰富.智能排序定位精准,立即找到想要的资源.新版可突破服务器封杀限制,一个能用的P2PSearcher.整 ...

  8. 一、Python安装下载

    下载地址:https://www.python.org/downloads/ 因为Python3.X和2.X有部分不兼容,有些不向下兼容,现在3.5的资料和插件少,故我就学习的2.7.11了; 下载后 ...

  9. 每天一个linux命令(22):tar命令

    通过SSH访问服务器,难免会要用到压缩,解压缩,打包,解包等,这时候tar命令就是是必不可少的一个功能强大的工具.linux中最流行的tar是麻雀虽小,五脏俱全,功能强大. tar命令可以为linux ...

  10. Android(java)学习笔记52:成员位置的内部类的介绍

    1. 内部类的定义 /* 内部类概述: 把类定义在其他类的内部,这个类就被称为内部类. 举例:在类A中定义了一个类B,类B就是内部类. 内部的访问特点: A:内部类可以直接访问外部类的成员,包括私有. ...