QP之QF原理


1.QP簡介:

量子平台(Quantum Platform, 簡稱QP)是一個用於實時嵌入式系統的軟件框架,QP是輕量級的、開源的、基於層次式狀態機的、事件驅動的平台。

QP包括事件處理器(QEP)、輕量級的事件驅動框架(QF)、任務調度微內核(QK)和實時跟蹤調試器(QS)四個部分。

利用QP可以開發出結構清晰的嵌入式應用程序(使用C或C++語言)。
QP
圖1.QP總體結構

2.QP之QF簡介

QF是QP的核心,可以把QF理解為軟件總線(software bus,SBus)。在這個軟件總線上連接着很多的AO和硬件中斷服務程序ISR,QF負責事件的存貯、分發和回收等功能,也就是事件驅動。

QF是一個事件驅動框架。應用程序可以創建事件實例,放到事件池中,並分發事件到相應注冊了這個事件的活動對象(狀態機,任務)AO中。應用程序可以注冊特定的事件,當有事件發生時,QF就會分發事件到AO中。應用程序是由多個AO組成,每個AO可以認為是一個任務。把硬件中斷程序也當做AO看待,只是優先級比較高。

QF量子框架由五個數據結構及操作組成,其數據結構采用了uCOS-II相似的結構。

9f2f070828381f30e47cb316ab014c086e06f023
圖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)函數分發事件。

1ff9d13f2e1bc7db7c1e717e
圖3.QF軟件總線和兩種投遞事件方式

框架QF包括活動對象AO,每個AO包含一個AO隊列(QEQueue)和狀態機。QF中還有5個主要的數據結構表,其中有3個AO相關的數據結構:AO訂閱事件表,AO隊列狀態表,AO注冊表;有1個事件池QMPool,用於保存事件實例,其它事件都是對這個事件實例的引用;有1個時間事件鏈表QtimeEvt,用於定時事件處理。圖 2是相應數據表與QF和AO的關系。

c7851ed5042bb4dd51da4bb4
圖4.QF框架及五個數據表

4.QF運行

QF運行時,包括的過程有:
(1)QF初始化;
(2)AO和ISR產生事件;
(3)分發事件到AO隊列;
(4)循環調度分派事件到狀態機。
在把事件放到AO隊列中時,會置位AO隊列狀態表相應位;從AO隊列中取出事件時,會清零AO隊列狀態表相應位。總之,放事件到AO隊列或從AO隊列取事件,都會修改AO隊列狀態表。

14b554da063bb7c2b7fd481f
圖5.QF運行過程及數據表關系

(1)QF初始化
在QF運行之前,首先要進行初始化,要創建AO、創建事件池、創建AO訂閱事件表,創建AO隊列等一系統開始工作。

717f7eec7ddfa5c82f2e21a7
圖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是一個微調度內核,這種方式任務是搶占式的。

兩種調度方式的流程:

a212f3249e5a832a8744f9a2
圖7.Vanilla調度流程

b2ba0f46e547d7106b63e587
圖8.QK調度流程

5.總結

QF是一個框架,用於事件的產生、保存、分發事件。有兩種事件分發方式,並支持兩種對任務的調度方式;可以理解QF為一個軟件總線,其上安裝了很多的AO和ISR。最多可以支持63個AO+ISR。

參考:
【1】QP量子平台、量子編程:http://www.state-machine.com


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM