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