QF结构分析

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

原文地址:https://www.cnblogs.com/water-sea/p/12059427.html

时间: 2024-11-13 08:07:14

QF结构分析的相关文章

PNG文件结构分析 ---Png解析

PNG文件结构分析 ---Png解析 为了实现更高级的应用,我们必须充分挖掘PNG的潜力. PNG的文件结构 根据PNG文件的定义来说,其文件头位置总是由位固定的字节来描述的: 十进制数 137 80 78 71 13 10 26 10 十六进制数 89 50 4E 47 0D 0A 1A 0A 其中第一个字节0x89超出了ASCII字符的范围,这是为了避免某些软件将PNG文件当做文本文件来处理.文件中剩余的部分由3个以上的PNG的数据块(Chunk)按照特定的顺序组成,因此,一个标准的PNG文

rpm --qf 命令

1. 环境准备: sudo apt-get install rpm (Ubuntu系统) wget ftp://rpmfind.net/linux/fedora-secondary/development/rawhide/Everything/ppc64le/os/Packages/y/yum-3.4.3-511.fc26.noarch.rpm(下载个rpm包供测试) 2. 使用方法: 查询所有信息: [email protected]:~/Downloads$ rpm -qpi yum-3.4

【转载】nedmalloc结构分析

原文:nedmalloc结构分析 nedmalloc是一个跨平台的高性能多线程内存分配库,很多库都使用它,例如:OGRE.现在我们来看看nedmalloc的实现 (以WIN32部分为例)    位操作小技巧:i.获取最低位的出现位置的掩码:x&(-x)ii.判断值为2的幂:x & (x-1) == 0iii.获取从最低的值为1的位开始到左边MSB的掩码: x | (-x)iv.字节对齐:(x + 2^m) &( 2^m -1) nedmalloc设计的数据结构和使用方法有几个有趣的

chromium for android GPU进程结构分析

GPU进程的客户端(Browser进程,Render进程)都会创建一个 WebGraphicsContext3DCommandBufferImpl的实例,用于封装与GPU进程的通信. 所以我们从WebGraphicsContext3DCommandBufferImpl开始引出GPU进程的结构. 一.WebGraphicsContext3DCommandBufferImpl的创建. WebGraphicsContext3D暴露的接口基本与OpenGL ES 2.0 API对应. WebGraphi

Android 4.0 ICS SystemUI浅析——StatusBar结构分析

Android 4.0 ICS SystemUI浅析——StatusBar结构分析 分类: Android2012-06-30 14:45 23687人阅读 评论(8) 收藏 举报 androidsignal代码分析iconseclipse平台 在上一篇文章<Android 4.0 ICS SystemUI浅析——SystemUI启动流程>中以及提到了SystemUI的组成,本文主要分析其中的StatusBar结构. 1.布局概览 首先,我们通过hierarchyviewer这个工具来查看一下

转载,crtmpserver文件夹结构分析

1. 顶层(crtmpserver/) 下的文件夹结构 3rdparty/             : 对lua, xml进行解析的源代码文件夹 sources/              : 项目的核心实现源代码文件夹 builders/              : 各种环境(VS2010, android, linux)下的项目生成 configs/               : 一些预定义的配置文件和示例启动脚本 docs/                  : 项目相关的文档 man

android 系统构架和应用程序目录结构分析

一.Android系统构架 Android系统从底向上一共分了4层,每一层都把底层实现封装,并暴露调用接口给上一层. Linux内核(Linux Kernel) Android运行在linux kernel 2.6之上,但是把linux内受GNU协议约束的部分做了取代,这样在Android的程序可以用于商业目的. Linux 内核是硬件和软件层之间的抽象层. 中间件 中间件包括两部分:核心库和运行时(libraries & Android runtime) 核心库包括,SurfaceManage

Android项目目录结构分析

项目结构如下图所示,使用不同sdk版本建立的项目项目结构有所不同,总体相同,高版本增加了一些包结构 1.src 和java项目一样src存放项目源代码 2.gen 自动生成,其中R.java文件也是自动生成,ADT 插件自动根据res中文件的变化修改R.java文件,将res中的资源对应一个16进制地址,用于在在代码中引用到这些资源文件. 3.bin 项目编译输出的目录,里面有apk文件 4.res 存放资源文件 a. drawable存放图片 (1)drawable-hdpi里面存放高分辨率的

【MySQL】mysql buffer pool结构分析

转自:http://blog.csdn.net/wyzxg/article/details/7700394 其他参考: <高性能MySQL> - 8.4.5 InnoDB缓冲池 <MySQL技术内幕InnoDB存储引擎>(第二版内容有所更新) - 2.3 InnoDB体系结构 ############################################## 书中是先对后台线程进行说明,然后对内存部分进行说明,这样更好理解innoDB引擎内存池在使用时的过程. [后台线程