一種實現VxWorks與Qt通信的消息隊列方法,適用于VxWorks與Qt的混合開發,采用以下步驟:S1、在VxWorks任務中聲明并創建一消息列隊;S2、在Qt主線程中創建若干Qt子線程,并在若干Qt子線程的外部聲明消息列隊;S3、若干Qt子線程分別同對應的VxWorks任務通過消息列隊機制進行通信。利用VxWorks消息隊列阻塞接收機制,實現VxWorks任務與Qt子線程的同步,保證消息隊列數據在任務或子線程讀寫時的原子操作,避免任務死鎖。
【技術實現步驟摘要】
本專利技術涉及嵌入式開發領域,特別涉及一種。
技術介紹
Qt是諾基亞開發的一個跨平臺的C++圖形用戶界面應用程序框架。它提供給應用程序開發者建立藝術級的圖形用戶界面所需的所用功能。并且Qt是完全面向對象的,很容易擴展,并且允許真正地組件編程;使用Qt開發的軟件,相同的代碼可以在任何支持的平臺上編譯與運行,而不需要修改源代碼。VxWorks操作系統是美國WindRiver公司于1983年設計開發的一種嵌入式實時操作系統(RT0S),是嵌入式開發環境的關鍵組成部分。VxWorks操作系統由于其良好的持續發展能力、高性能的內核以及友好的用戶開發環境,在嵌入式實時操作系統領域占據一席之地。它以其良好的可靠性和卓越的實時性被廣泛地應用在通信、軍事、航空、航天等高精尖技術及實時性要求極高的領域中,如衛星通訊、軍事演習、彈道制導、飛機導航等。為了結合Qt和VxWorks的優點,目前提出了 VxWorks和Qt相結合的開發模式。然而,Qt用于圖形界面處理的線程只能有一個,即主線程QApplication。如果Vxfforks直接和Qt主線程通信,有可能導致Qt主線程因阻塞或延遲而無法連貫處理圖形界面。為提高處理性能,可以創建Qt子線程專門負責與VxWorks的任務進行數據交換,再通過子線程將處理好的數據轉發給Qt主線程。目前在VxWorks和Qt相結合的開發模式下,多采用信號量配合共享內存的方法實現二者之間的數據交換。但多個VxWorks任務或Qt子線程對同一塊共享內存進行讀、寫操作時,由于任務或子線程之間的不同步,會破壞數據的完整性,導致讀、寫數據的錯誤。如果對共享內存數據進行臨界區或互斥保護,盡管保證了數據在讀、寫時的完整性,但會在一定條件下引發任務優先級翻轉,甚至出現任務死鎖,從而使系統的實時性受到影響。
技術實現思路
本專利技術針對現有技術存在的上述不足,提供一種,利用VxWorks消息隊列阻塞接收機制,實現了 VxWorks任務與Qt子線程的同步,保證了消息隊列數據在任務或子線程讀寫時的原子操作,避免了任務死鎖。本專利技術通過以下技術方案實現 一種,適用于VxWorks與Qt的混合開發,采用以下步驟 51、在VxWorks任務中聲明并創建一消息列隊; 52、在Qt主線程中創建若干Qt子線程,并在若干Qt子線程的外部聲明消息列隊; S3、若干Qt子線程分別同對應的VxWorks任務通過消息列隊機制進行通信。較佳的,在步驟S3中,通過消息列隊機制進行通信包括 51、一第一Qt子線程阻塞接收消息列隊,并發送給Qt主線程; 52、Qt主線程釋放一反饋數據至一第二Qt子線程; 53、第二Qt子線程阻塞接收該反饋數據,并反饋給該消息列隊; 54、Vxfforks任務阻塞接收該消息列隊。較佳的,在步驟SI中包括,當消息列隊為VxWorks特有數據類型時,需要先在Qt主線程中進行元類型的聲明和注冊,以使Qt能夠識別。較佳的,在步驟S3中包括,第一 Qt子線程接收到的消息列隊通過信號/槽機制傳輸給Qt主線程進行畫面顯示。較佳的,在步驟S4中包括,Qt主線程的反饋數據通過信號量類同步傳遞給該第二Qt子線程進行消息列隊的組織。較佳的,消息列隊的數據緩沖區創建于VxWorks任務的上下文中。本專利技術的有益效果是,實現了 VxWorks任務與Qt子線程的同步,保證了數據交互時讀、寫的完整。可通過定義多個消息隊列對多個任務分別進行通信,避免多個任務對同一塊共享內存的競爭,有效避免了任務優先級翻轉和任務死鎖,保證了系統的實時性。另外,相比共享內存的全局性,消息隊列數據緩沖區是在任務的上下文中創建的,它是局部的,有效降低了任務間的耦合度。附圖說明圖1為本專利技術提供的一實施例的主流程 圖2為本專利技術中消息隊列由VxWorks任務發送到Qt主線程的流程 圖3為本專利技術中消息隊列由Qt主線程發送到VxWorks任務的流程 圖4為本專利技術的主流程時序分析圖。具體實施例方式下面結合實施例對本專利技術作詳細說明,本實施例在以本專利技術技術方案為前提下進行實施,給出了詳細的實施方式,但本專利技術的保護范圍不限于下述的實施例。本專利技術采用的技術方案是,創建所需數量的Qt子線程,分別同對應的VxWorks任務通過消息隊列機制進行通信。VxWorks任務完成對消息隊列的創建及初始化,Qt子線程外部引用該消息隊列。任務和子線程根據需要既可作為消息隊列的發送者,也可作為其接收者。其中,消息隊列的數據類型可以自由定義,但VxWorks特有數據類型需要在Qt主線程中進行元類型METATYPE的聲明和注冊,從而使Qt能夠得以識別。另外,Qt子線程接收到的消息隊列可以通過信號/槽機制傳遞給Qt主線程進行畫面顯示,Qt主線程的反饋數據也可通過信號量類QSemaphore同步傳遞給Qt子線程進行消息隊列的組織。請參考圖1,本專利技術提供一較佳實施例加以說明。VxWorks主流程首先初始化了信號量、消息隊列、看門狗這三個主要資源,隨后啟動了看門狗定時器和三個用戶級任務。看門狗定時器回調函數通過釋放信號量,為網絡組播發送任務提供定時周期。網絡組播接收任務通過套接字Socket接收到網絡報文后,將報文數據發送到消息隊列I。數據接收任務阻塞等待來自Qt子線程的消息隊列2。Vxfforks主流程最后調用Qt入口函數,啟動Qt主流程。Qt主流程在進行一系列和圖形界面相關的初始化后,創建了兩個子線程。子線程I阻塞等待來自網絡組播接收任務的消息隊列1,并將消息隊列通過信號函數的參數發送給Qt主線程的槽函數,主線程即可根據數據信息進行畫面顯示。子線程2阻塞獲取主線程釋放的信號量,周期性的將反饋數據發送到消息隊列2。通過主流程圖,可以看到實施例中用到了四種任務及線程的通信方法。請參考圖2,VXWorkS任務發送數據到消息隊列。Qt子線程I阻塞接收消息隊列,并將該消息隊列通過信號發送出去。Qt主線程在創建、啟動子線程I并設置信號/槽連接后,槽函數會接收到信號,消息隊列是通過信號/槽的函數參數進行傳遞的。請參考圖3,Qt主線程創建并啟動了定時器QTimer和子線程2,同時連接定時器超時信號到主線程槽函數,通過槽函數釋放Qt信號量QSemaphore。子線程2阻塞等待來自主線程的Qt同步信號量,獲取到該信號量后,子線程2發送反饋數據到消息隊列。VxWorks任務阻塞接收該消息隊列,并實現對信息的打印。請參考圖4,可以看到主流程產生了 6個用戶級任務,其中,tmcast_Recv、pthr2、tmcast _Send和pthrl上的方框為消息隊列發送、接收,實心三角形信號量發送,空心三角形為信號量接收,虛線為阻塞狀態,波浪線為待執行狀態,直線條為執行狀態。tmcast_Recv是VxWorks網絡組播接收任務,tmcast _Send是VxWorks網絡組播發送任務、tQt_To_Vx是數據接收任務、pthrl和pthr2是Qt的兩個子線程、tQtGui是Qt主線程。tmcast_Recv阻塞等待接收tmcast_Send發出的網絡組播報文。收到報文后,tmcast_Recv立即發送報文到消息隊列1,pthrl負責接收。另外,pthr2發送報文到消息隊列2, tQt_To_Vx負責接收。以上公開的僅為本申請本文檔來自技高網...
【技術保護點】
一種實現VxWorks與Qt通信的消息隊列方法,適用于VxWorks與Qt的混合開發,其特征在于,采用以下步驟:S1、在VxWorks任務中聲明并創建一消息列隊;S2、在Qt主線程中創建若干Qt子線程,并在所述若干Qt子線程的外部聲明所述消息列隊;S3、所述若干Qt子線程分別同對應的VxWorks任務通過消息列隊機制進行通信。
【技術特征摘要】
1.一種實現VxWorks與Qt通信的消息隊列方法,適用于VxWorks與Qt的混合開發,其特征在于,采用以下步驟 51、在VxWorks任務中聲明并創建一消息列隊; 52、在Qt主線程中創建若干Qt子線程,并在所述若干Qt子線程的外部聲明所述消息列隊; 53、所述若干Qt子線程分別同對應的VxWorks任務通過消息列隊機制進行通信。2.如權利要求1所述的實現VxWorks與Qt通信的消息隊列方法,其特征在于,在步驟S3中,所述通過消息列隊機制進行通信包括 51、一第一Qt子線程阻塞接收所述消息列隊,并發送給所述Qt主線程; 52、所述Qt主線程釋放一反饋數據至一第二Qt子線程; 53、所述第二Qt子線程阻塞接收該反饋數據,并反饋給該消息列隊; 54、Vxfforks任務阻塞接收...
【專利技術屬性】
技術研發人員:高宇,劉成芳,丁寶華,顧少華,
申請(專利權)人:上海航天測控通信研究所,
類型:發明
國別省市: