QP运行架构图(QF).doc

上传人:scccc 文档编号:12514247 上传时间:2021-12-04 格式:DOC 页数:8 大小:427KB
返回 下载 相关 举报
QP运行架构图(QF).doc_第1页
第1页 / 共8页
QP运行架构图(QF).doc_第2页
第2页 / 共8页
QP运行架构图(QF).doc_第3页
第3页 / 共8页
QP运行架构图(QF).doc_第4页
第4页 / 共8页
QP运行架构图(QF).doc_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《QP运行架构图(QF).doc》由会员分享,可在线阅读,更多相关《QP运行架构图(QF).doc(8页珍藏版)》请在三一文库上搜索。

1、QP 运行架构图( QF )QF 是一个事件驱动框架。应用程序可以创建事件实例,放到事件池中,并分发事件到 相应注册了这个事件的活动对象(状态机,任务) AO 中【 应用程序可以注册特定的事件, 当有事件发生时, QF 就会分发事件到 AO 中 】,有两种事件分发方式, 并支持两种对任务的 调度方式。应用程序是由多个 AO 组成,每个 AO 可以认为是一个任务。把硬件中断程序也当做AO看待,只是优先级比较高。 可以把QF理解为软件总线(software bus, SBus)。在这个 软件总线上连接着很多的 AO和硬件中断服务程序ISR【最多可以支持63个AO+ISR ,QF 负责事件的存贮、分

2、发,也就是事件驱动。1、QF 中事件的分发如图1所示,QF是个软件总线,在这个软件总线上连接着AO和ISR。QF中包含5个主要的数据结构, QF 有两种事件的分发方式。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

3、 不用知道目标 AO , QF 查找 AO 订阅事件表 就知道把事件分发到什么地方 。 P/S 投递方式减少了 AO 之间的 耦合度。 使用void QF_publish(QEvent const *e) 函数分发事件。QAtchf fxiMFIFOjQQEHnt Cofiil刊瞰遴瞬ftQF p-uMhhi QEvenl cuitsl图1: QF软件总线和两种投递事件方式2、QF中的数据结构表框架QF包括活动对象 AO,每个AO包含一个AO队列(QEQueue)和状态机。QF中还有5个主要的数据结构表,其中 有3个AO相关的数据结构:AO订阅事件表,AO队列状态表,AO注册表;有1个事件池Q

4、MPool,用于保存事件实例,其它事件都是对这个事件实例的引用 ;有1个时间事件链表 QtimeEvt,用于定时事件处理。图2是相应 数据表与QF和AO的关系。芬发車件QF pubhuhOf松QArtivrQF分滤事件 到状恚机QXsiiii disptiirclKHhlJliLni丿定时申断 调用QLticBO打阅丿嘏消申件QAdi r vubMTribtl 卄QAei ie_u ii suhscrllMjl 1 QPStl64_rrnbo> 沿:_!i *QFSctt4_in«ri t|J:他注JttWA:;:Q55QI1 rcnioi(? 0OritnrLYlQMPeiu

5、I时同爭件钉农事件池0FH巳样成寥f1实网空阪QQIMFooLgH 計1JMPi>hI pLllL)QSiibiCil -Ke*Qi- _suhscrLiiiQPSriS(观QPS«64、Ql- TTdlh''成 QK rtMlySei)CJActivt; "廿 actiT'c (|变量结构体相关:M)订闻事辞表 却行T 诽辑号T 毎打Jtt大6斗位, 可以 ITRIF3 t A0,也号等于AO 的优先栽右.m狀列状总卷左示M'P队剜肯尢H ft Vnni LI niZQK/tl A /z StrlUrt!按忧覺tl存哉 QA图2: Q

6、F框架及五个数据表userailocatedL contiguous buffer of EnemorynFreenMmMULLgiviPooistartblockSize图:QP事件池中事件实例的存放( QMPOOL )-> outgo!ng eventfront Evt扎出nTotnUsed未使用数童nMax:QEQik?u«juser-allocated ring buffer of pointers to eventsendhead£> indexA pointer图:QP中的事件队列的环状队列( QEQueue)向QEQueue队列中加入事件或信号的操

7、作过程:/ * insert event into the ring buffer (FIFO) */ QF_R£1I_DUEUE_AT_ (adb# nie>iiead) . sig = B±>g;#if (PARAM SIZE != 0)F_RCIL1_DUEUE_AT_ ( a<zk>, me>tLead) .par = par» endlE'iT (me->haad = ':uint8_t) 0)m&->h.ead = Q REU BYTEaeb->erLd) ;f* wrap the

8、 head */-me->tiaadr+ma - >nUjsed ;ir (ma->nU3«l = <uints_t) 1) /* is thi石 the first event? */Qfrea<et_ 1= QJMUBYTE (ijx>wJLfcifl)Me->prio >/* set the bit */从QEQueue队列中取出事件或信号的操作过程:/* map p to AO */a.cb = & QF_ active p ; a = QF R函 ACTIVE GET (p);QF_INT_DISA£LE()

9、;_ASSERT(a->nUsed > uint8_t: 0);-M->rLUsad;/ w get ready to scce» the qu亡u亡 */ / * some events must be available */if (a->nUsed = (uince tO) f* 口u亡u亡 becoming empty?QfreadySet_ £=(invpQw2Lkup Ip ) j / T cler the bit */ - - lendif_PAR(a:- = Qr_ROM_aUEUE,par;Q SIG- QF ROM QUEUE A

10、T (acbr a-*tail).sig; pa5jm_size != 0)if (a->tail (uints_t>) /* wrap around? */a->tail Q_RDU_BYTE (a eb- > end);a->cail;QF_INT_ENABL£ (? ;/ * unlo匚k interrupts to launch a task */在QP的事件分发中,事件实例储存在事件池中,QP平台采用的是传递事件指针的形式,这样显著减小了系统中队列需求对内存的开销。ovcnTqdCuoL holding pointers to eve its丿

11、Ev 亡 ntPxl!acttve*ProducerBdynamic eventsactive >ProducerAirttsrnal l threadstalk event (rot from 在 peril)ISRil)pointers to Nevenit inetarces图:QP的事件分发机制在QEP的原理中,每一个活动对象(一个状态机)都有自己的事件队列,当有ISR到active L objectISR1ISR2eent、 queueactive、event loop1 丄ii / 1e = queue get();A/dispaT_blocking . Gpo-atbn来时,会根据不同的活动对象进行事件的处理,参见下图。图:QEP的事件处理模型3、QF运行过程QF运行时,包括的过程有:(1)QF初始化;(2)AO和ISR产生事件;(3)分发事件到AO队列;(4)循环调度分派事件到状态机。在把事件放到 AO队列中时,会置1 AO队列状态表相应位; 从AO队列中取出事件时,会置0 AO队列状态表相应位。 总之,放事件到AO队列或从AO队列取事件,都会修改AO 队列状态表。到畑机VanUh 或QKIJSnbwjrL?ii*QJ subscrLislQFSctNfyiiyPSetM)QFjradySct_(诫 QKjcadyS 劭图3: QF运行过程及数据表关系

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1