CN103019823B - 实现VxWorks与Qt通信的消息队列方法 - Google Patents
实现VxWorks与Qt通信的消息队列方法 Download PDFInfo
- Publication number
- CN103019823B CN103019823B CN201210534623.8A CN201210534623A CN103019823B CN 103019823 B CN103019823 B CN 103019823B CN 201210534623 A CN201210534623 A CN 201210534623A CN 103019823 B CN103019823 B CN 103019823B
- Authority
- CN
- China
- Prior art keywords
- vxworks
- sub
- message
- task
- message queue
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Landscapes
- Communication Control (AREA)
- Multi Processors (AREA)
Abstract
一种实现VxWorks与Qt通信的消息队列方法,适用于VxWorks与Qt的混合开发,采用以下步骤:S1、在VxWorks任务中声明并创建一消息列队;S2、在Qt主线程中创建若干Qt子线程,并在若干Qt子线程的外部声明消息列队;S3、若干Qt子线程分别同对应的VxWorks任务通过消息列队机制进行通信。利用VxWorks消息队列阻塞接收机制,实现VxWorks任务与Qt子线程的同步,保证消息队列数据在任务或子线程读写时的原子操作,避免任务死锁。
Description
技术领域
本发明涉及嵌入式开发领域,特别涉及一种实现VxWorks与Qt通信的消息队列方法。
背景技术
Qt是诺基亚开发的一个跨平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。并且Qt是完全面向对象的,很容易扩展,并且允许真正地组件编程;使用Qt开发的软件,相同的代码可以在任何支持的平台上编译与运行,而不需要修改源代码。
VxWorks操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),是嵌入式开发环境的关键组成部分。VxWorks操作系统由于其良好的持续发展能力、高性能的内核以及友好的用户开发环境,在嵌入式实时操作系统领域占据一席之地。它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。
为了结合Qt和VxWorks的优点,目前提出了VxWorks和Qt相结合的开发模式。
然而,Qt用于图形界面处理的线程只能有一个,即主线程QApplication。如果VxWorks直接和Qt主线程通信,有可能导致Qt主线程因阻塞或延迟而无法连贯处理图形界面。为提高处理性能,可以创建Qt子线程专门负责与VxWorks的任务进行数据交换,再通过子线程将处理好的数据转发给Qt主线程。
目前在VxWorks和Qt相结合的开发模式下,多采用信号量配合共享内存的方法实现二者之间的数据交换。但多个VxWorks任务或Qt子线程对同一块共享内存进行读、写操作时,由于任务或子线程之间的不同步,会破坏数据的完整性,导致读、写数据的错误。如果对共享内存数据进行临界区或互斥保护,尽管保证了数据在读、写时的完整性,但会在一定条件下引发任务优先级翻转,甚至出现任务死锁,从而使系统的实时性受到影响。
发明内容
本发明针对现有技术存在的上述不足,提供一种实现VxWorks与Qt通信的消息队列方法,利用VxWorks消息队列阻塞接收机制,实现了VxWorks任务与Qt子线程的同步,保证了消息队列数据在任务或子线程读写时的原子操作,避免了任务死锁。
本发明通过以下技术方案实现:
一种实现VxWorks与Qt通信的消息队列方法,适用于VxWorks与Qt的混合开发,采用以下步骤:
S1、在VxWorks任务中声明并创建一消息列队;
S2、在Qt主线程中创建若干Qt子线程,并在若干Qt子线程的外部声明消息列队;
S3、若干Qt子线程分别同对应的VxWorks任务通过消息列队机制进行通信。
较佳的,在步骤S3中,通过消息列队机制进行通信包括:
S1、一第一Qt子线程阻塞接收消息列队,并发送给Qt主线程;
S2、Qt主线程释放一反馈数据至一第二Qt子线程;
S3、第二Qt子线程阻塞接收该反馈数据,并反馈给该消息列队;
S4、VxWorks任务阻塞接收该消息列队。
较佳的,在步骤S1中包括,当消息列队为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接收到网络报文后,将报文数据发送到消息队列1。数据接收任务阻塞等待来自Qt子线程的消息队列2。VxWorks主流程最后调用Qt入口函数,启动Qt主流程。Qt主流程在进行一系列和图形界面相关的初始化后,创建了两个子线程。子线程1阻塞等待来自网络组播接收任务的消息队列1,并将消息队列通过信号函数的参数发送给Qt主线程的槽函数,主线程即可根据数据信息进行画面显示。子线程2阻塞获取主线程释放的信号量,周期性的将反馈数据发送到消息队列2。通过主流程图,可以看到实施例中用到了四种任务及线程的通信方法。
请参考图2,VxWorks任务发送数据到消息队列。Qt子线程1阻塞接收消息队列,并将该消息队列通过信号发送出去。Qt主线程在创建、启动子线程1并设置信号/槽连接后,槽函数会接收到信号,消息队列是通过信号/槽的函数参数进行传递的。
请参考图3,Qt主线程创建并启动了定时器QTimer和子线程2,同时连接定时器超时信号到主线程槽函数,通过槽函数释放Qt信号量QSemaphore。子线程2阻塞等待来自主线程的Qt同步信号量,获取到该信号量后,子线程2发送反馈数据到消息队列。VxWorks任务阻塞接收该消息队列,并实现对信息的打印。
请参考图4,可以看到主流程产生了6个用户级任务,其中,tmcast_Recv、pthr2、tmcast_Send和pthr1上的方框为消息队列发送、接收,实心三角形信号量发送,空心三角形为信号量接收,虚线为阻塞状态,波浪线为待执行状态,直线条为执行状态。tmcast_Recv是VxWorks网络组播接收任务,tmcast_Send是VxWorks网络组播发送任务、tQt_To_Vx是数据接收任务、pthr1和pthr2是Qt的两个子线程、tQtGui是Qt主线程。tmcast_Recv阻塞等待接收tmcast_Send发出的网络组播报文。收到报文后,tmcast_Recv立即发送报文到消息队列1,pthr1负责接收。另外,pthr2发送报文到消息队列2,tQt_To_Vx负责接收。
以上公开的仅为本申请的一个具体实施例,但本申请并非局限于此,任何本领域的技术人员能思之的变化,都应落在本申请的保护范围内。
Claims (5)
1.一种实现VxWorks与Qt通信的消息队列方法,适用于VxWorks与Qt的混合开发,其特征在于,采用以下步骤:
S1、在VxWorks任务中声明并创建一消息列队;
S2、在Qt主线程中创建若干Qt子线程,并在所述若干Qt子线程的外部声明所述消息列队;
S3、所述若干Qt子线程分别同对应的VxWorks任务通过消息列队机制进行通信;
其中在步骤S3中,所述通过消息列队机制进行通信包括:
S3.1、一第一Qt子线程阻塞接收所述消息列队,并发送给所述Qt主线程;
S3.2、所述Qt主线程释放一反馈数据至一第二Qt子线程;
S3.3、所述第二Qt子线程阻塞接收该反馈数据,并反馈给该消息列队;
S3.4、VxWorks任务阻塞接收该消息列队。
2.如权利要求1所述的实现VxWorks与Qt通信的消息队列方法,其特征在于,在步骤S1中包括,当所述消息列队为VxWorks特有数据类型时,需要先在Qt主线程中进行元类型的声明和注册,以使Qt能够识别。
3.如权利要求1所述的实现VxWorks与Qt通信的消息队列方法,其特征在于,在步骤S3中包括,第一Qt子线程接收到的消息列队通过信号/槽机制传输给Qt主线程进行画面显示。
4.如权利要求1所述的实现VxWorks与Qt通信的消息队列方法,其特征在于,在步骤S3.4中包括,Qt主线程的反馈数据通过信号量类同步传递给该第二Qt子线程进行消息列队的组织。
5.如权利要求1所述的实现VxWorks与Qt通信的消息队列方法,其特征在于,所述消息列队的数据缓冲区创建于VxWorks任务的上下文中。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210534623.8A CN103019823B (zh) | 2012-12-12 | 2012-12-12 | 实现VxWorks与Qt通信的消息队列方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210534623.8A CN103019823B (zh) | 2012-12-12 | 2012-12-12 | 实现VxWorks与Qt通信的消息队列方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103019823A CN103019823A (zh) | 2013-04-03 |
CN103019823B true CN103019823B (zh) | 2016-06-08 |
Family
ID=47968454
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201210534623.8A Active CN103019823B (zh) | 2012-12-12 | 2012-12-12 | 实现VxWorks与Qt通信的消息队列方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103019823B (zh) |
Families Citing this family (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106648816B (zh) * | 2016-12-09 | 2020-03-17 | 武汉斗鱼网络科技有限公司 | 多线程处理系统及方法 |
CN108228360B (zh) * | 2016-12-21 | 2021-03-16 | 龙芯中科技术股份有限公司 | VxWorks与Qt的事件通信方法和装置 |
CN107391125B (zh) * | 2017-07-03 | 2021-01-15 | 中国船舶重工集团公司第七一九研究所 | VxWorks系统下用于人机交互的用户界面设计方法 |
CN110018890B (zh) * | 2018-01-10 | 2021-07-30 | 武汉斗鱼网络科技有限公司 | 一种线程间的交互方法、电子设备及可读存储介质 |
CN110764935B (zh) * | 2019-10-28 | 2023-07-14 | 天津津航计算技术研究所 | 一种基于实时操作系统的任务间消息高效传递方法 |
CN112114982B (zh) * | 2020-09-09 | 2022-03-08 | 天津津航计算技术研究所 | 基于VxWorks系统的多任务间共享内存的管理方法 |
CN114217894B (zh) * | 2021-12-10 | 2023-09-05 | 中国人民解放军96901部队25分队 | 一种采用Qt实现雷达屏显的方法 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101266561A (zh) * | 2008-04-29 | 2008-09-17 | 中兴通讯股份有限公司 | 一种在多核多线程处理器中的核间消息通信方法 |
CN101872317A (zh) * | 2010-07-16 | 2010-10-27 | 山东中创软件工程股份有限公司 | VxWorks多任务同步与通信方法 |
CN102591726A (zh) * | 2011-12-31 | 2012-07-18 | 青岛海信宽带多媒体技术有限公司 | 一种多进程通信方法 |
CN102591658A (zh) * | 2011-12-28 | 2012-07-18 | 奇智软件(北京)有限公司 | 一种消息处理方法及装置 |
-
2012
- 2012-12-12 CN CN201210534623.8A patent/CN103019823B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101266561A (zh) * | 2008-04-29 | 2008-09-17 | 中兴通讯股份有限公司 | 一种在多核多线程处理器中的核间消息通信方法 |
CN101872317A (zh) * | 2010-07-16 | 2010-10-27 | 山东中创软件工程股份有限公司 | VxWorks多任务同步与通信方法 |
CN102591658A (zh) * | 2011-12-28 | 2012-07-18 | 奇智软件(北京)有限公司 | 一种消息处理方法及装置 |
CN102591726A (zh) * | 2011-12-31 | 2012-07-18 | 青岛海信宽带多媒体技术有限公司 | 一种多进程通信方法 |
Also Published As
Publication number | Publication date |
---|---|
CN103019823A (zh) | 2013-04-03 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103019823B (zh) | 实现VxWorks与Qt通信的消息队列方法 | |
CN101529392B (zh) | 在非侵入性数字信号处理器调试期间用于指令填充操作的方法和系统 | |
Menard et al. | Achieving determinism in adaptive AUTOSAR | |
CN109656533B (zh) | 一种软硬件解耦合的软件化雷达系统 | |
US20060156284A1 (en) | Architecture of Ticc-Ppde, a new paradigm for parallel programming | |
Bonarini et al. | R2P: An open source hardware and software modular approach to robot prototyping | |
CN105279131B (zh) | 用于模块式管芯上相干互连的方法、设备和系统 | |
CN103729329A (zh) | 核间通信装置及方法 | |
CN101365999A (zh) | 发送完成事件批处理 | |
WO2002031672A2 (en) | Method and apparatus for interprocessor communication and peripheral sharing | |
CN101681191A (zh) | 在电能转换期间的数字信号处理器调试 | |
US20100183082A1 (en) | System and method for transferring telemetry data between a ground station and a control center | |
EP2551771A1 (en) | Communication abstraction among partitions in integrated modular avionics | |
CN105740139A (zh) | 一种基于虚拟环境的嵌入式软件调试方法 | |
EP4394603A1 (en) | Vehicle-mounted operating system, debugging system and method, electronic device and storage medium | |
Bateni et al. | Risk and Mitigation of Nondeterminism in Distributed Cyber-Physical Systems | |
CN113885365A (zh) | 用于控制多个类型的移动平台的数据处理系统、计算机实现的方法、计算机程序和存储介质 | |
Yin et al. | Towards mode switch handling in component-based multi-mode systems | |
CN108664443A (zh) | 数据通讯同步方法及系统 | |
CN103176926A (zh) | 调试屏障事务 | |
CN114553980B (zh) | 一种控制流与数据流解耦的消息服务方法 | |
CN116166582A (zh) | 一种数据的读写方法、系统、设备及存储介质 | |
CN106302148A (zh) | 基于lbm的备份数据传输方法和系统 | |
Fischer et al. | Towards interprocess communication and interface synthesis for a heterogeneous real-time rapid prototyping environment | |
Paczesny et al. | ProxyMotes: Linux-based TinyOS platform for non-TinyOS sensors and actuators |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |