CN110764935B - 一种基于实时操作系统的任务间消息高效传递方法 - Google Patents
一种基于实时操作系统的任务间消息高效传递方法 Download PDFInfo
- Publication number
- CN110764935B CN110764935B CN201911031121.1A CN201911031121A CN110764935B CN 110764935 B CN110764935 B CN 110764935B CN 201911031121 A CN201911031121 A CN 201911031121A CN 110764935 B CN110764935 B CN 110764935B
- Authority
- CN
- China
- Prior art keywords
- message
- type
- pointer
- data
- function
- 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
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/546—Message passing systems or structures, e.g. queues
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02P—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN THE PRODUCTION OR PROCESSING OF GOODS
- Y02P90/00—Enabling technologies with a potential contribution to greenhouse gas [GHG] emissions mitigation
- Y02P90/02—Total factory control, e.g. smart factories, flexible manufacturing systems [FMS] or integrated manufacturing systems [IMS]
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computer And Data Communications (AREA)
Abstract
本发明公开了一种基于实时操作系统的任务间消息队列高效传递方法,对实时操作系统的底层消息传递方法进行二次封装,使用一种新的数据结构管理消息队列的传输,该数据结构包括消息类型,消息功能码,数据长度以及数据指针,其中数据指针为动态内存申请所得该指针所指向的内容,由用户数据指针所指向数据拷贝而来,用户调用后即可释放。消息队列接收端则采用查找表来定位执行函数,当数据取走后即可释放消息队列发端申请的指针,该种方法使用固定长度的结构,解决了传统方案申请大数组的资源浪费和效率低的问题,结构体和查找表等采用模块化封装,保证了消息准确高效的传递。
Description
技术领域
本发明属于计算机软件设计领域,涉及一种基于实时操作系统的任务间消息高效传递方法。
背景技术
实时操作系统是一种基于任务优先级的操作系统,在系统运行过程中,任务之间需要频繁地进行消息传递,使用系统中提供的原生消息队列函数是一种任务间高效传递信息的方法,其中消息队列的长度是已知的确定值,但在实际应用中,消息的长度经常是不固定的,传统的做法是在消息队列创建之初,将消息的长度值设为一个很大的值,足够包含使用中的长度要求,此外还需要申请一个足够大的数组来临时存储要发送的消息。这种设计方法的缺点是需要占用很大的内存空间,内存空间浪费比较大,消息队列的使用率和传输效率都比较低,软件本身的可扩展性比较差,而且当任务之间传递多种类型的数据时,只能在数据内容中增加判别消息功能类型的字节信息,这种做法破坏了消息的完整性,同时增加了解析的难度和工作量。
发明内容
(一)发明目的
本发明的目的为:提供一种基于实时操作系统的任务间消息高效传递方法,解决传统消息队列传输过程中内存浪费和传输效率低的问题,以增强软件的内存使用率、可扩展性和传递效率。
(二)技术方案
为了解决上述技术问题,本发明提供一种基于实时操作系统的任务间消息高效传递方法,其包括以下步骤:
S1:定义一个消息队列要传递的消息结构体;
S2:对消息队列发送过程的封装;
S3:定义消息接收处理函数的查找表;
S4:对消息队列接收过程的封装。
所述步骤S1中,消息队列包括传递消息的消息类型、消息的功能码、需要传递消息的长度和需要传递消息的指针,消息类型标记此消息属于公有消息类型或者私有消息类型,消息的功能码表示消息的功能类型。
所述步骤S2中,定义消息结构体MSG_STRU,结构体中消息类型MsgType占用一个字节,用char型变量表示,消息类型包括公有消息类型0和私有消息类型1;消息的功能码FunCode占用一个字节,用char型变量表示,消息的功能码包括1553B总线消息处理-0,CAN总线消息处理-1,串口消息处理-2;长度信息LenInfo占用两个字节,用short型变量表示,消息的长度信息为上层要发送数据的实际长度;消息的指针pData使用unsignedchar*变量类型表示,指针所指向实际传递数据的首地址。
所述步骤S2中,首先申请步骤S1中所述消息结构体的指针,将用户传递过来的消息类型、功能码和数据长度赋值给指针对应的成员变量;然后采用动态内存申请获得一个同样长度的空间;将应用层传递进来的数据指针所指的空间内容拷贝到动态内存的申请空间,使用实时操作系统提供的消息队列发送函数将结构体发送出去。
所述步骤S2中,消息队列发送过程中,传递的结构体的长度固定,消息队列发送函数调用完毕需判断消息队列返回值,如果返回错误,则将动态申请内存的指针释放。
所述步骤S2中,消息队列的发送过程中,开放给应用层的接口包括消息队列的ID,消息类型usr_type,消息功能码usr_code,数据指针usr_pdata,数据长度usr_len。
所述步骤S2中,消息队列发送的过程如下:
STEP21:申请一个MSG_STRU类型结构指针pMsgStru;
STEP22:获取应用层传进来的参数,消息类型usr_type、消息功能码usr_code、数据长度usr_len分别赋值pMsgStru结构指针所指的消息类型、消息功能码、数据长度三个成员;
STEP23:数据指针采用动态内存申请一个长度为usr_len的内存pTransfer,将usr_pdata开始长度为usr_len的数据拷贝到pTransfer起始的usr_len长度的空间,并将指针pTransfer赋值给pMsgStru结构里的数据指针变量;
STEP24:传入消息队列ID参数,使用消息队列发送函数msgQSend,将pMsgStru结构指针的内容发送出去;
STEP25:判断消息队列发送的返回值,如果发送失败需要将动态内存申请的数据指针pTransfer进行释放。
所述步骤S3中,在消息队列接收端需要建立一个查找表,查找表的结构包括消息类型、功能码以及对数据进行进一步处理的函数指针。
所述步骤S4中,当消息队列收到数据后,将收到的消息类型、功能码和查找表进行匹配对比,匹配成功后运行查找表中对应函数,处理接收到的数据。
所述步骤S4中,消息队列接收数据的过程如下:
STEP31:接收任务建立一个结构体数组查找表,结构体内容包括一个字节的MsgType、一个字节的功能码FunCode、一个void*类型的函数指针pFunc,函数指针所指向的函数为收到对应消息类型对应功能码的数据后的处理函数;
STEP32:在接收任务中申请一个MSG_STRU类型结构指针栈变量pMsgStru;
STEP33:由ID作为唯一标识符接收数据,运行msgQReceive以WAIT_FOREVER作为参数阻塞等待;
STEP34:当任务收到数据,任务向下运行,将消息队列中的数据取出,将取出的数据赋值到结构体指针pMsgStru,遍历比较匹配pMsgStru指向的消息类型和消息功能码和结构体数组查找表中的消息类型MsgType,以及功能码FunCode;当匹配成功后,由对应函数指针指向的处理函数对接收到的数据进行处理。
(三)有益效果
上述技术方案所提供的基于实时操作系统的任务间消息高效传递方法,使消息队列传递的数据不受长度限制,可扩展性强,同时继承了系统中提供消息队列的可靠性等优点;新的封装结构,使消息队列的使用更加方便快捷。
附图说明
图1一种基于实时操作系统的任务间消息发送流程图。
具体实施方式
为使本发明的目的、内容和优点更加清楚,下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。
为了解决实时操作系统中任务间消息的传递效率问题,采取以下具体实施措施,以VxWorks操作系统为例但不仅仅限制于VxWorks操作系统。
本发明基于实时操作系统的任务间消息高效传递方法包括以下步骤:
S1:定义一个消息队列要传递的消息结构体
消息队列包括传递消息的消息类型、消息的功能码、需要传递消息的长度和需要传递消息的指针,消息类型标记此消息属于公有消息类型或者私有消息类型,消息的功能码表示消息的功能类型。
定义消息结构体MSG_STRU,结构体中消息类型MsgType占用一个字节,用char型变量表示,消息类型包括公有消息类型0和私有消息类型1;消息的功能码FunCode占用一个字节,用char型变量表示,消息的功能码包括1553B总线消息处理-0,CAN总线消息处理-1,串口消息处理-2等;长度信息LenInfo占用两个字节,用short型变量表示,消息的长度信息为上层要发送数据的实际长度;消息的指针pData使用unsignedchar*变量类型表示,这个指针所指向实际传递数据的首地址。
S2:对消息队列发送过程的封装
在使用消息队列发送过程中,首先申请一个步骤S1中所述的消息队列管理结构的指针,将用户传递过来的消息类型、功能码和数据长度赋值给这个结构指针对应的成员变量,考虑到应用层调用完消息队列后将要发送数据的指针释放,采用动态内容申请获得一个同样长度的空间。并将应用层传递进来的数据指针所指的空间内容拷贝到上述动态内存的申请空间。使用实时操作系统提供的消息队列发送函数将结构体发送出去。使用上述方法消息队列传递过程中,传递的结构体的长度固定,不会因为传递数据的长短而调整消息队列中消息空间的大小,消息队列发送函数调用完毕需判断消息队列返回值,如果返回错误,则将动态申请内存的指针释放,优化了内存空间的使用。
结合图1消息队列的发送流程:开放给应用层的接口包括消息队列的ID,消息类型usr_type,消息功能码usr_code,数据指针usr_pdata,数据长度usr_len。
消息队列发送的过程如下:
STEP21:申请一个MSG_STRU类型结构指针pMsgStru;
STEP22:获取应用层传进来的参数,消息类型usr_type,消息功能码usr_code,数据长度usr_len分别赋值pMsgStru结构指针所指的消息类型,消息功能码,数据长度三个成员。
STEP23:数据指针采用动态内存申请一个长度为usr_len的内存pTransfer,将usr_pdata开始长度为usr_len的数据拷贝到pTransfer起始的usr_len长度的空间,并将指针pTransfer赋值给pMsgStru结构里的数据指针变量。
STEP24:传入消息队列ID参数,使用消息队列发送函数msgQSend,将pMsgStru结构指针的内容发送出去。
STEP25:判断消息队列发送的返回值,如果发送失败需要将动态内存申请的数据指针pTransfer进行释放。
S3:定义消息接收处理函数的查找表
在消息队列接收端需要建立一个查找表,查找表的结构需要包括消息类型,功能码,以及对数据进行进一步处理的函数指针。
S4:对消息队列接收过程的封装
当消息队列收到数据后,将收到的消息类型、功能码和查找表进行匹配对比,匹配成功后运行查找表中对应函数,处理接收到的数据。
消息队列接收数据的过程如下:
STEP31:接收任务需要建立一个结构体数组查找表,结构体内容包括一个字节的MsgType,一个字节的功能码FunCode,一个void*类型的函数指针pFunc,函数指针所指向的函数为收到对应消息类型对应功能码的数据后的处理函数。
STEP32:在接收任务中申请一个MSG_STRU类型结构指针栈变量pMsgStru;
STEP33:由ID作为唯一标识符接收数据,运行msgQReceive以WAIT_FOREVER作为参数阻塞等待。
STEP34:当任务收到数据,任务向下运行,将消息队列中的数据取出,将取出的数据赋值到结构体指针pMsgStru,遍历比较匹配pMsgStru指向的消息类型和消息功能码和结构体数组查找表中的消息类型MsgType,以及功能码FunCode。当匹配成功后,由对应函数指针指向的处理函数对接收到的数据进行处理。
利用上述技术方案,,本发明可以实现实时操作系统的任务间消息高效传递,该方法已经经过了理论论证,并进行了实验测试。结果表明,该方案可以实现消息在任务间简捷高效地传递。
由以上技术方案可以看出,本发明具有以下显著特点:
(1)本发明的消息传递方法,使用一种新的结构来管理消息队列,使得消息类型、消息长度、消息功能类型作为消息参数一起传递,传递的结构体的长度始终固定,有效提高了内存的使用效率。
(2)本发明的消息传递方法,在消息接收过程中使用查找表进行匹配,提高了消息处理的效率。
(3)本发明的消息的传递方法,消息发送和消息接收均可以单独封装成函数,增强了可扩展性。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和变形,这些改进和变形也应视为本发明的保护范围。
Claims (1)
1.一种基于实时操作系统的任务间消息高效传递方法,其特征在于,包括以下步骤:
S1:定义一个消息队列要传递的消息结构体;
S2:对消息队列发送过程的封装;
S3:定义消息接收处理函数的查找表;
S4:对消息队列接收过程的封装;
所述步骤S1中,消息队列包括传递消息的消息类型、消息的功能码、需要传递消息的长度和需要传递消息的指针,消息类型标记此消息属于公有消息类型或者私有消息类型,消息的功能码表示消息的功能类型;
所述步骤S1中,定义消息结构体MSG_STRU,结构体中消息类型MsgType占用一个字节,用char型变量表示,消息类型包括公有消息类型0和私有消息类型1;消息的功能码FunCode占用一个字节,用char型变量表示,消息的功能码包括1553B总线消息处理-0,CAN总线消息处理-1,串口消息处理-2;长度信息LenInfo占用两个字节,用short型变量表示,消息的长度信息为上层要发送数据的实际长度;消息的指针pData使用unsigned char*变量类型表示,指针所指向实际传递数据的首地址;
所述步骤S2中,首先申请步骤S1中所述消息结构体的指针,将用户传递过来的消息类型、功能码和数据长度赋值给指针对应的成员变量;然后采用动态内存申请获得一个同样长度的空间;将应用层传递进来的数据指针所指的空间内容拷贝到动态内存的申请空间,使用实时操作系统提供的消息队列发送函数将结构体发送出去;
所述步骤S2中,消息队列发送过程中,传递的结构体的长度固定,消息队列发送函数调用完毕需判断消息队列返回值,如果返回错误,则将动态申请内存的指针释放;
所述步骤S2中,消息队列的发送过程中,开放给应用层的接口包括消息队列的ID,消息类型usr_type,消息功能码usr_code,数据指针usr_pdata,数据长度usr_len;
所述步骤S2中,消息队列发送的过程如下:
STEP21:申请一个MSG_STRU类型结构指针pMsgStru;
STEP22:获取应用层传进来的参数,消息类型usr_type、消息功能码usr_code、数据长度usr_len分别赋值pMsgStru结构指针所指的消息类型、消息功能码、数据长度三个成员;
STEP23:数据指针采用动态内存申请一个长度为usr_len的内存pTransfer,将usr_pdata开始长度为usr_len的数据拷贝到pTransfer起始的usr_len长度的空间,并将指针pTransfer赋值给pMsgStru结构里的数据指针变量;
STEP24:传入消息队列ID参数,使用消息队列发送函数msgQSend,将pMsgStru结构指针的内容发送出去;
STEP25:判断消息队列发送的返回值,如果发送失败需要将动态内存申请的数据指针pTransfer进行释放;
所述步骤S3中,在消息队列接收端需要建立一个查找表,查找表的结构包括消息类型、功能码以及对数据进行进一步处理的函数指针;
所述步骤S4中,当消息队列收到数据后,将收到的消息类型、功能码和查找表进行匹配对比,匹配成功后运行查找表中对应函数,处理接收到的数据;
所述步骤S4中,消息队列接收数据的过程如下:
STEP31:接收任务建立一个结构体数组查找表,结构体内容包括一个字节的MsgType、一个字节的功能码FunCode、一个void*类型的函数指针pFunc,函数指针所指向的函数为收到对应消息类型对应功能码的数据后的处理函数;
STEP32:在接收任务中申请一个MSG_STRU类型结构指针栈变量pMsgStru;
STEP33:由ID作为唯一标识符接收数据,运行msgQReceive以WAIT_FOREVER作为参数阻塞等待;
STEP34:当任务收到数据,任务向下运行,将消息队列中的数据取出,将取出的数据赋值到结构体指针pMsgStru,遍历比较匹配pMsgStru指向的消息类型和消息功能码和结构体数组查找表中的消息类型MsgType,以及功能码FunCode;当匹配成功后,由对应函数指针指向的处理函数对接收到的数据进行处理。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911031121.1A CN110764935B (zh) | 2019-10-28 | 2019-10-28 | 一种基于实时操作系统的任务间消息高效传递方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911031121.1A CN110764935B (zh) | 2019-10-28 | 2019-10-28 | 一种基于实时操作系统的任务间消息高效传递方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110764935A CN110764935A (zh) | 2020-02-07 |
CN110764935B true CN110764935B (zh) | 2023-07-14 |
Family
ID=69334159
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201911031121.1A Active CN110764935B (zh) | 2019-10-28 | 2019-10-28 | 一种基于实时操作系统的任务间消息高效传递方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110764935B (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112114982B (zh) * | 2020-09-09 | 2022-03-08 | 天津津航计算技术研究所 | 基于VxWorks系统的多任务间共享内存的管理方法 |
CN112231082A (zh) * | 2020-10-15 | 2021-01-15 | 天津津航计算技术研究所 | 一种多任务实时操作系统下开关量输入输出批量管理方法 |
CN113609124B (zh) * | 2021-06-18 | 2024-03-26 | 天津津航计算技术研究所 | 一种具有可扩展性的数据记录存储方法及系统 |
CN113608883B (zh) * | 2021-06-21 | 2024-02-13 | 天津津航计算技术研究所 | 一种基于VxWorks实时操作系统的封装方法 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103019823A (zh) * | 2012-12-12 | 2013-04-03 | 上海航天测控通信研究所 | 实现VxWorks与Qt通信的消息队列方法 |
CN104346229A (zh) * | 2014-11-14 | 2015-02-11 | 国家电网公司 | 一种用于嵌入式操作系统进程间通讯优化的处理方法 |
CN106293970A (zh) * | 2016-08-09 | 2017-01-04 | 浪潮(北京)电子信息产业有限公司 | 一种基于ipc的进程间异步处理方法及系统 |
CN107992370A (zh) * | 2017-11-28 | 2018-05-04 | 上海机电工程研究所 | VxWorks平台多任务软件框架实现方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7549151B2 (en) * | 2005-02-14 | 2009-06-16 | Qnx Software Systems | Fast and memory protected asynchronous message scheme in a multi-process and multi-thread environment |
-
2019
- 2019-10-28 CN CN201911031121.1A patent/CN110764935B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103019823A (zh) * | 2012-12-12 | 2013-04-03 | 上海航天测控通信研究所 | 实现VxWorks与Qt通信的消息队列方法 |
CN104346229A (zh) * | 2014-11-14 | 2015-02-11 | 国家电网公司 | 一种用于嵌入式操作系统进程间通讯优化的处理方法 |
CN106293970A (zh) * | 2016-08-09 | 2017-01-04 | 浪潮(北京)电子信息产业有限公司 | 一种基于ipc的进程间异步处理方法及系统 |
CN107992370A (zh) * | 2017-11-28 | 2018-05-04 | 上海机电工程研究所 | VxWorks平台多任务软件框架实现方法 |
Non-Patent Citations (1)
Title |
---|
周喃.基于VxWorks的CPCI总线双向传输设计和实现.《科技信息》.2014,第159-160页. * |
Also Published As
Publication number | Publication date |
---|---|
CN110764935A (zh) | 2020-02-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110764935B (zh) | 一种基于实时操作系统的任务间消息高效传递方法 | |
US6826763B1 (en) | Accelerating a distributed component architecture over a network using a direct marshaling | |
US8984530B2 (en) | Queued message dispatch | |
CN102780613A (zh) | 一种分布式设备板间通信的方法与装置 | |
CN108833578B (zh) | 基于fifo命名管道进行双工通信的方法及相关设备 | |
CN112068970B (zh) | 基于异构多核处理器的rpc实现方法及介质 | |
US20180262560A1 (en) | Method and system for transmitting communication data | |
CN113778714B (zh) | 一种Linux兼容Android的共享剪切板方法及装置 | |
US7167934B1 (en) | Peripheral device data transfer protocol | |
CN111294293B (zh) | 一种基于用户态协议栈的网络隔离方法和装置 | |
CN113296979B (zh) | 一种虚幻引擎与外部程序的数据通信方法 | |
CN114189569B (zh) | 一种数据传输方法、装置及系统 | |
CN107329842B (zh) | 基于Qt信号槽机制的获取数据的方法及终端 | |
CN115225482B (zh) | 一种基于Kubernetes进行Pod容器网络配置的方法及装置 | |
CN112398870B (zh) | 跨平台协议生成方法、装置、系统、设备及存储介质 | |
JP2607612B2 (ja) | ジョブ転送方法 | |
CN111669423B (zh) | 基于用户态协议栈的网络隔离空间的批量处理方法及系统 | |
CN112948129A (zh) | 基于联邦学习的数据传输优化方法、设备及可读存储介质 | |
CN113608883B (zh) | 一种基于VxWorks实时操作系统的封装方法 | |
CN112685197B (zh) | 接口数据的交互系统 | |
CN113176957B (zh) | 一种基于rpc的远程应用自动化系统 | |
CN111865675B (zh) | 容器的收发限速方法、装置及系统 | |
CN116743587B (zh) | 一种基于异构计算加速卡的虚拟网络接口实现方法及装置 | |
CN111858002B (zh) | 一种基于异步io的并发处理方法、系统及装置 | |
CN117421138A (zh) | 一种进程间通信方法、装置、电子设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |