性无码一区二区三区在线观看,少妇被爽到高潮在线观看,午夜精品一区二区三区,无码中文字幕人妻在线一区二区三区,无码精品国产一区二区三区免费

程序小白
認(rèn)證:優(yōu)質(zhì)創(chuàng)作者
所在專題目錄 查看專題
【第六篇】基于QP開發(fā)應(yīng)用程序的套路分享
【第七篇】哲學(xué)家就餐問題的對象分解
【第八篇】QF框架之時(shí)間管理——定時(shí)事件
【第九篇】QF框架之對象計(jì)算模式——活動對象
【第十篇】QF框架之事件管理——事件派發(fā)機(jī)制
【第十一篇】QF框架之事件管理——事件內(nèi)存(上)
作者動態(tài) 更多
基于stm32采用PWM驅(qū)動伺服控制器學(xué)習(xí)筆記
5天前
基于STM32驅(qū)動TM1638學(xué)習(xí)筆記——軟件篇
04-19 12:42
基于TM1638驅(qū)動8位數(shù)碼管設(shè)計(jì)分享
02-24 11:26
RT-Thread驅(qū)動之路: Studio創(chuàng)建FAL分區(qū)⑤
01-02 08:30
RT-Thread驅(qū)動之路: Studio 掛載通用SPI flash④
2024-12-23 13:41

【第十篇】QF框架之事件管理——事件派發(fā)機(jī)制

      這一篇我們來聊聊關(guān)于事件的派發(fā)機(jī)制,狀態(tài)機(jī)要真正的被激活進(jìn)行相應(yīng)的處理是需要事件的輸入的??梢园阉醋魇鞘录南M(fèi)者,事件的生產(chǎn)者和消費(fèi)者之間不能通過共享全局變量的方式來進(jìn)行信息交換,這好像是我們前面講的QP開發(fā)應(yīng)用程序的第一條準(zhǔn)則,因此需要有人來承接事件傳輸?shù)娜蝿?wù),這個(gè)由QF框架來負(fù)責(zé)。

      QF框架提供了兩種事件的派發(fā)機(jī)制: 

      第一種、直接發(fā)送事件機(jī)制。這種是最實(shí)用的機(jī)制,他的原理很簡單,事件產(chǎn)生者,直接將事件發(fā)送給事件的消費(fèi)者(活動對象)事件的生產(chǎn)者有很多,例如ISR、設(shè)備驅(qū)動代碼、運(yùn)行在框架之外的代碼。但是事件的消費(fèi)者只能是活動對象,為什么?因?yàn)槭录g的通信是異步的,只有活動對象擁有事件隊(duì)列。QPC6.9.1中給出了三種直接發(fā)送事件的API,如下圖:

      

然而其API中,關(guān)于這個(gè)函數(shù)有什么區(qū)別以及怎么用只是很簡單的提了提,并不是很詳細(xì),所以我們?nèi)炙阉髁苏麄€(gè)源碼包中,所有使用到的API,挑幾個(gè)有代表性的應(yīng)用是來看下:

      第二種、發(fā)行-訂閱機(jī)制。這一種是比較高級的用法,假如你第一次接觸QP并且沒有RTOS編程的經(jīng)驗(yàn),第一次接觸QP建議你先忽略掉這種方法,會第一種就足夠了,你在實(shí)際應(yīng)用中完全可以通過第一種用法,解決繁瑣問題,當(dāng)然有些場合應(yīng)用第二種方法會簡便很多,例如一個(gè)活動對象要發(fā)送一個(gè)事件給很多其它的活動對象時(shí),應(yīng)用第一種,你需要知道每個(gè)活動對象的名字(指針)這樣要進(jìn)行很多次的發(fā)送操作,然而應(yīng)用第二種時(shí),你只需要告訴QF框架,你要發(fā)行某個(gè)事件,至于發(fā)給誰那就要QF框架自己看看都有誰(哪個(gè)活動對象訂閱了這個(gè)事件了)

      發(fā)行訂閱機(jī)制有個(gè)需要注意的點(diǎn),就是QF框架需要記住訂閱者的信息, 當(dāng)接收到某事件發(fā)行的信號時(shí),需要查找這個(gè)記錄集合,找到某事件對應(yīng)的活動對象,這樣才能完成指定的發(fā)送。這個(gè)記錄的結(jié)構(gòu)體集合在QPC6.9.1的說明,如下圖:

      講到這里了,其實(shí)可以筆鋒一轉(zhuǎn),接著講API ,然后后面是例子中的應(yīng)用了,但是甘心嗎?你不想知道這個(gè)發(fā)行訂閱機(jī)制是怎么實(shí)現(xiàn)的嗎?哈哈,雖然可能會有點(diǎn)混亂,但是那就讓我們混亂下去吧,接下來讓我們深度解析一下,這個(gè)我不推薦新手用的發(fā)行訂閱機(jī)制,QF框架是怎么找到對應(yīng)活動對象的(面對疾風(fēng)吧~?。?/strong>,其實(shí),他是通過查表法來實(shí)現(xiàn)的,先來講原理,看一下他的表圖構(gòu)造:

      首先這是一個(gè)二維表,縱向是事件,不同的事件放在不同的位置上,橫向的每個(gè)bit上代表活動狀態(tài)機(jī)的優(yōu)先級,因?yàn)榛顒訉ο蟮膬?yōu)先級是唯一的,所以可以通過它找到對應(yīng)的對象,在QP量子編程中,一個(gè)應(yīng)用里面最多有64個(gè)狀態(tài)機(jī),一個(gè)應(yīng)用會有多少個(gè)事件呢,好像沒有嚴(yán)格限制。接下來看一下這個(gè)結(jié)構(gòu)集合的定義:

      從上面可以看到他定位的是一個(gè)一維表,或者叫一維數(shù)組,他只有活動對象方向,并不完整,它還需要縱向的事件維度,這里其實(shí)它把控制權(quán)交給了我們的應(yīng)用,因?yàn)槟阕畲笮枰嗛啂讉€(gè)事件,那么你就定義一個(gè)特定大小的數(shù)組,如下:

      定義好了我們的事件-對象二維表以后,在使用前,我們需要先把他初始化,QF提供了專門的API來完成該部分內(nèi)容:

      完成初始化以后,我們就可以使用訂閱API函數(shù),訂閱某個(gè)事件了,同樣也可以使用發(fā)行事件API,進(jìn)行事件的發(fā)布:

      對于發(fā)行-訂閱機(jī)制,又訂閱就有解除訂閱,解除訂閱可以是為某個(gè)活動對象解除特定事件的訂閱,也可以清空某個(gè)對象的所有訂閱,如下:

      到這里關(guān)于事件的派發(fā)機(jī)制相關(guān)內(nèi)容都分析完了,看到這里如果你也很感興趣,不妨自己找個(gè)demo實(shí)踐一下筆記中給大家講解的相關(guān)理論是否正確,下篇再見。

聲明:本內(nèi)容為作者獨(dú)立觀點(diǎn),不代表電子星球立場。未經(jīng)允許不得轉(zhuǎn)載。授權(quán)事宜與稿件投訴,請聯(lián)系:editor@netbroad.com
覺得內(nèi)容不錯的朋友,別忘了一鍵三連哦!
贊 4
收藏 5
關(guān)注 150
成為作者 賺取收益
全部留言
0/200
成為第一個(gè)和作者交流的人吧