一种基于共享内存的通信方法及装置的制作方法

文档序号:6580321阅读:153来源:国知局
专利名称:一种基于共享内存的通信方法及装置的制作方法
技术领域
本发明涉及通信技术领域, 具体涉及一种基于共享内存的通信方法及装置。
背景技术
在两个CPU之间通过共享内存通信时,目前较常见的有以下几种方法。第一种方法是将共享内存存分为两块,分别作为两个CPU的发送、接收通道, 如图1所示。每个通道提供一个读写标志位,该标志初始为可写态。发送方发送数据后 将读写标志由可写态修改为可读态,等待接收方接收。接收方接收数据后将读写标志由 可读态修改为可写态,以便发送方可以继续发送。采用这种方法,每一次的数据交互都 需要等待对方读或写完毕,效率很低。第二种方法也是将共享内存分为两块,分别作为两个CPU的发送、接收通道, 每个通道用一个环形队列实现循环读写,如图2所示。环形队列通过存放在邮箱中的读 写指针进行管理。以CPUl发送为例,CPUl有数据需要发送时,首先通过环形队列1的 读、写指针计算是否有足够的剩余空间,如果空间足够,则将消息包写入写指针所指位 置,并更新写指针。CPU2定时轮询环形队列1,发现有新的消息包时,则读取消息包, 并更新读指针。由于发送方和接收方可以同时操作共享内存,比前面的方法效率上大大 提高,但是还是存在以下问题1、数据一般按定长打包发送,对于消息包长度相差大,例如最小长度为4字 节,最大长度为40字节,都要按最大的40字节打包发送,造成浪费。2、在队列尾端空间不够存放新消息包时,一般为了操作方便不允许消息包卷 绕,就需要填充特殊值(例如OxFFFF)指示该尾端空间无效,并将消息包放置到队列头 部。接收时需要和特殊值比较,判断是正常消息包还是卷绕时的填充值。如果正常消息 包中包含特殊值,就会产生冲突。第三种方法,即现有专利文献《一种基于共享存储器的双CPU通信方法》,专 利申请号为200610103231.0,使用了两个环形队列,如图3所示,一个用于存放消息索 弓丨,另一个用于存放消息实体。其中,消息索引是大小固定为4字节且指向消息实体的 指针,如图4所示,消息实体大小可变。但此方法有如下不足1、在程序设计中必须时刻注意消息索引和消息实体队列的同步,需要同时维护 两个队列,增加了程序的复杂性。2、易造成浪费。当有很多小的消息包致使消息索引队列满时,整个消息通道将 不可用,即使消息实体队列还有很大的空间也不能使用。

发明内容
本发明所要解决的技术问题是,提供一种基于共享内存的通信方法及装置,可 以支持多通道、可变消息长度。为了解决上述问题,本发明公开了一种基于共享内存的通信方法,包括
发送方将所要发送的内容作为消息体写入内存的通道,并为该消息体配置定长 的消息头以构成传输消息,其中,所述消息头中至少携带所述消息体的长度;接收方从所述通道中读取所述消息头,根据所述消息头的起始地址以及消息头 的长度确定所述消息体的起始地址,再根据所述消息体的起始地址以及所述消息头中消 息体的长度,确定所述消息体在所述内存通道的位置,在该位置上读取所述消息体,进 行处理。进一步地,在所述发送方将所述消息体写入内存通道前,上述方法还包括; 所述发送方与所述接收方将内存划分为多个通道,为各通道配置通道描述符, 所述通道描述符包括通道的基地址、通道的大小以及通道的读写指针。其中,发送方将所要发送的消息体写入内存通道时,还将该通道的写指针指向 该通道的下一个可用单元;所述接收方判断所述通道的读、写指针不相等时,才读取所述传输消息,并将 所述通道的读指针指向下一个传输消息。所述消息头还包括下一跳地址,所述下一跳地址表示下一个传输消息的消息头 的起始地址。所述发送方将所述传输消息写入内存的通道时,若所述通道底部空闲空间小于 所述传输消息的长度,且所述通道顶部空闲空间大于所述传输消息的长度,则在所述通 道的底部写入一空消息头,将所述传输消息写入所述通道的顶部,其中,所述空消息头 中消息体的长度为零,下一跳地址为零;若所述接收方从所述通道中读取到所述空消息头,则从所述通道的顶部读取传 输消息,进行处理。本发明还公开了一种基于共享内存的通信装置,包括发送单元、接收单元,处 理单元,其中所述发送单元,用于将所述处理单元发送的传输消息写入内存的通道;所述接收单元,用于从内存的通道中读取传输消息的消息头,根据所述消息头 的起始地址以及消息头的长度确定所述传输消息的消息体的起始地址,再根据所述消息 体的起始地址以及所述消息头中消息体的长度,确定所述消息体在所述内存通道的位 置,在该位置上读取所述消息体,并将所读取的消息体发送到所述处理单元;所述处理单元,用于将所要传输的内容作为消息体,为该消息体配置定长的消 息头以构成传输消息,并将所述传输消息发送给所述发送单元,以及用于接收所述接收 单元发送的消息体,对该消息体进行处理。进一步地,上述通信装置中,所述处理单元,还用于将内存划分为多个通道, 为各通道配置通道描述符,所述通道描述符包括通道的基地址、通道的大小以及通道的 读写指针。其中,所述发送单元,将所述消息写入内存的通道时,还用于将该通道的写指 针指向该通道的下一个可用单元;所述接收单元,还用于判断所述通道的读、写指针是否相等,当所述通道的 读、写指针不相等时,读取所述传输消息的消息头,并将该通道的读指针指向下一个传 输消息。
所述处理单元,在所述消息头中配置下一跳地址,所述下一跳地址表示下一个 传输消息的消息头的起始地址。所述处理单元,在所述内存的通道底部空闲空间小于所述传输消息的长度,且 所述通道顶部空闲空间大于所述传输消息的长度时,还用于向所述发送单元发送一空消 息头,其中,所述空消息头中消息体的长度为零,下一跳地址为零;所述发送单元,还用于接收所述处理单元发送的空消息头,并将所述空消息头 写入所述通道的底部,将所述传输消息写入所述通道的顶部,以及在读取到空消息头 时,再从所述通道的顶部读取传输消息,并将所述传输消息的消息体发送给所述处理单元。采用本发明技术方案后,可支持多通道,可支持可变长消息,本发明技术方案 尤其适用于消息流量大、且消息包不定长的情况。此外本发明也可用于基于共享内存的 单一 CPU下的多任务间通信。


图1是现有技术的共享内存的双CPU通信示意图;图2是现有技术的每个通道用一个环形队列的双CPU通信示意图;图3是现有技术中的每个通道用两个环形队列的双CPU通信示意图;图4是现有技术中的消息索引与消息实体关系示意图;图5是本发明装置实现通信的示意图;图6是本发明中传输消息的结构示意图;图7是本发明中发送消息流程图;图8是本发明中通道描述符示意图;图9是本发明中各通道示意图;图10是本发明中接收消息流程图。
具体实施例方式本发明的主要构思是,定义第一装置(例如,CPUl或者任务一的实现装置)发 送、第二装置(例如,CPU2或任务二)接收的通道为下行通道,而第二装置发送、第一 装置接收的通道为上行通道。对于下行通道,写指针第一装置可写,第二装置只读,读 指针第一装置只读,第二装置可写;对于上行通道,写指针第二装置可写,第一装置只 读,读指针第二装置只读,第一装置可写,如图5所示。发送方(第一装置或者第二装置)传输消息后,可以通过中断方式通知接收方 (第二装置或者第一装置)去接收,另外,接收方也可以用轮询的方式接收。在整个通讯处理过程中进一步分为如下三个流程第一部分,初始化流程根据系统需要,分别设定下行通道和上行通道个数,其中,一个通道即为一个 队列,初始化读写指针指均向队列头部。第二部分,发送传输消息流程根据传输消息和队列的大小,判断是否可以写入新的传输消息,如果是,则将新的传输消息写入对应通道,并更新该通道的写指针(写指针指向新的传输消息之后的 可用单元),否则延迟后再发。第三部分,接收传输消息流程通过判断队列读、写指针是否相等,以确定是否有新的传输消息,当读、写指 针不相等时,表示有新的传输消息;读、写指针相等,表示没有新的传输消息;
当有新的传输消息时,获取消息头,更新队列读指针(指向下一个传输消息), 并根据消息头,使用用户注册的回调函数对该新的传输消息的数据进行处理。下面结合具体实施例及附图对本发明技术方案作进一步的描述。一种基于共享内存的通讯装置,包括发送单元,接收单元以及处理单元。下面 介绍各单元的功能。发送单元,用于发送处理单元发送的新的传输消息,即将新的传输消息写入通 道;其中,发送单元在发送传输消息过程中,需要判断所要发送的新的传输消息的 长度(即消息头与消息体的总长度)是否大于等于该通道的空闲空间,其中,当所要发送 的新的传输消息的长度大于等于该通道的空闲空间时,表示通道满,无法写入新的传输 消息,此时需要继续等待;当所要发送的新的传输消息的长度小于通道的空闲空间时, 表示通道未满,可以写入新的传输消息;进一步地,当处理单元向所述发送单元发送空的消息头(即该空消息头中的消 息长度为0,下一跳地址为0)时,发送单元在该通道底部写入该空消息头,将新的传输 消息写入该通道的顶部;接收单元,用于接收对端发送的新的传输消息,即读取通道中的新的传输消 息,读取新的传输消息的消息头,并根据消息头地址及消息头长度,确定消息体的起始 地址,从该起始地址开始读取消息体,要读取的长度为消息头中的消息体长度,将所读 取的消息体发送到处理单元;处理单元,用于构造新的传输消息,将新的传输消息发送到发送单元,以及用 于接收接收单元发送的消息体,并使用注册的回调函数对该消息进行处理;其中,处理单元所构造的新的传输消息分为定长的消息头和消息体(即为所要 传输的内容)两部分,如图6所示,其中,定长有消息头为16字节,消息头中,魔数占 4字节,消息类型占4字节,消息体长度占4字节,下一跳地址(即为下一个消息的消息 头地址)占4字节,而消息体长度可变。进一步地,当内存的通道的底部空闲空间小于新的传输消息的长度,而该通道 的顶部空闲空间大于新的传输消息的长度时,处理单元还构造一个空消息头发送给发送 单元,该空消息头中消息长度置为0,下一跳地址设置为0。下面介绍上述装置之间进行通讯的过程,在本实施例中,各装置即为一个 CPU,即本实施例为双CPU之间实现通讯的过程,现以该通讯过程的下行方向(即第一 装置向第二装置传输消息的方向)为例,介绍通讯过程,该过程分为发送部分和接收部 分,其中,发送过程,如图7所示,包括以下步骤步骤700:将共享内存分别划分为多个上行通道和下行通道,为各通道配置通 道描述符,并将通道描述符中通道的读写指针初始化为0,以表示队列空,没消息,同时注册收到消息时处理的回调函数; 本实施例中,可以根据用户需要或者传输消息的大小,将共享内存划分为四个 通道(一个通道即为一个传输队列),其中,两个通道为上行通道,另外两个通道为下行 通道,各通道描述符,用于描述各通道的基地址、通道的大小以及通道的读写指针,如 图8所示。步骤701:发送方判断下行通道是否满,如果是,则继续等待,否则进入步骤 702 ;该步骤中,发送方可以判断所要发送的新的传输消息的长度(新的传输消息的 长度指消息头与消息体的总长度)是否大于等于该通道的空闲空间,以判断下行通道是 否满,其中,当新所要发送的新的传输消息的长度大于等于该通道的空闲空间时,表示 通道满,无法写入新的传输消息,此时需要继续等待;当新所要发送的新的传输消息的 长度小于通道的空闲空间时,表示通道未满,可以写入新的传输消息;具体地,根据该通道的读、写指针,即可判断新的传输消息的长度是否大于等 于该通道的空闲空间。通道的空闲空间可以通过读、写指针来计算写指针大于读指针 时,通道的空闲空间=通道的长度_(写指针_读指针);读指针大于写指针时,队列的 空闲空间=读指针-写指针。步骤702:判断该通道的底部空闲空间是否大于等于新的传输消息的长度,如 果是,进入步骤706,否则进入步骤703;步骤703:判断该通道的顶部空闲空间是否小于等于新的传输消息的长度,如 果是,则继续等待,否则进入步骤704;步骤704:发送方在该通道底部写入空消息头,将该空消息头中的消息长度设 置为0,并该空消息头中的下一跳地址设置为0;步骤705:发送方在该通道的顶部空闲空间写入新的传输消息,结束发送流 程;步骤706:将新的传输消息依次写入该通道的空闲空间,并更新该新的传输消 息的消息头中的下一跳地址,以及该通道的写指针,结束发送流程。本实施例中,在下行通道中写入各个消息后,如图9所示;每个新的传输消息 分为消息头和消息体两部分,如图6所示,其中,消息头是定长的16字节,消息头中, 魔数占4字节,消息类型占4字节,消息体长度占4字节,下一跳地址占4字节,而消息 体长度(即为消息的具体内容)可变。整个通道的大小以消息头的长度(也即16字节) 对齐。待写入的新的传输消息的长度在写入队列时也以消息头的长度(也即16字节)对 齐。接收过程如图10所示,包括以下步骤步骤1001:接收方判断下行通道中是否有新的传输消息,如果有,进入步骤 1002,否则继续等待;该步骤中,接收方判断下行通道为空时,即表示没有新的传输消息,判断下行 通道不为空时,表示有新的传输消息,具体地,判断该下行通道的读、写指针相等时, 表示通道为空,判断下行通道的读、写指针不相等时,表示该下行通道非空。步骤1002 读取该新的传输消息的消息头,并根据该消息头的地址及其长度确定该新的传输消息的消息体的起始地址,即消息头的地址+消息头的长度=消息体的地 址,并使用注册的回调函数对该消息进行处理,同时并更新该下行通道的读指针(即将 读指针指向下一个消息)。该步骤中,当接收方获取 的消息头中的消息体长度和下一跳地址均为0时,表 明该消息在发送时由于队列底部空间不够,只在底部存放了一个空头,而真正的消息存 放在队列的顶部,此时直接读取队列顶部即可获得真正的消息头。在本实施例中,在访问消息头和队列描述符时还要注意字节序的问题,因为 CPUl和CPU2可能字节序不同。在其他实施例中,各装置可以代表一任务的实现装置,两个装置之间的通讯过 程,即为两个任务(例如任务1和任务2)间进行大数据量的通信过程。从上述实施例可以看出,本发明技术方案可支持多通道,可支持可变长消息。 并且,为了避免消息包卷绕时填充特殊值,在队列尾端空间不够存放新消息包时,直接 存放到队列头,根本无需关心消息包是否卷绕。发送方还可以连续发送消息,将多条消 息堆积在缓冲区内,而接收方则可以连续处理缓冲区内的多条消息。这样就减少了发 送方和接收方的等待时间,减少了接收方重复进中断或查询的次数,提高了 CPU的利用 率,提高了数据吞吐量和处理速度。以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的 技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的 任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
权利要求
1.一种基于共享内存的通信方法,其特征在于,该方法包括发送方将所要发送的内容作为消息体写入内存的通道,并为该消息体配置定长的消 息头以构成传输消息,其中,所述消息头中至少携带所述消息体的长度;接收方从所述通道中读取所述消息头,根据所述消息头的起始地址以及消息头的长 度确定所述消息体的起始地址,再根据所述消息体的起始地址以及所述消息头中消息体 的长度,确定所述消息体在所述内存通道的位置,在该位置上读取所述消息体,进行处 理。
2.如权利要求1所述的方法,其特征在于,在所述发送方将所述消息体写入内存通道 前,该方法还包括;所述发送方与所述接收方将内存划分为多个通道,为各通道配置通道描述符,所述 通道描述符包括通道的基地址、通道的大小以及通道的读写指针。
3.如权利要求2所述的方法,其特征在于,发送方将所要发送的消息体写入内存通道时,还将该通道的写指针指向该通道的下 一个可用单元;所述接收方判断所述通道的读、写指针不相等时,才读取所述传输消息,并将所述 通道的读指针指向下一个传输消息。
4.如权利要求1至3任一项所述的方法,其特征在于,所述消息头还包括下一跳地址,所述下一跳地址表示下一个传输消息的消息头的起 始地址。
5.如权利要求4所述的方法,其特征在于,所述发送方将所述传输消息写入内存的通道时,若所述通道底部空闲空间小于所述 传输消息的长度,且所述通道顶部空闲空间大于所述传输消息的长度,则在所述通道的 底部写入一空消息头,将所述传输消息写入所述通道的顶部,其中,所述空消息头中消 息体的长度为零,下一跳地址为零;若所述接收方从所述通道中读取到所述空消息头,则从所述通道的顶部读取传输消 息,进行处理。
6.—种基于共享内存的通信装置,其特征在于,该装置包括发送单元、接收单元, 处理单元,其中所述发送单元,用于将所述处理单元发送的传输消息写入内存的通道;所述接收单元,用于从内存的通道中读取传输消息的消息头,根据所述消息头的起 始地址以及消息头的长度确定所述传输消息的消息体的起始地址,再根据所述消息体的 起始地址以及所述消息头中消息体的长度,确定所述消息体在所述内存通道的位置,在 该位置上读取所述消息体,并将所读取的消息体发送到所述处理单元;所述处理单元,用于将所要传输的内容作为消息体,为该消息体配置定长的消息头 以构成传输消息,并将所述传输消息发送给所述发送单元,以及用于接收所述接收单元 发送的消息体,对该消息体进行处理。
7.如权利要求6所述的通信装置,其特征在于,所述处理单元,还用于将内存划分为多个通道,为各通道配置通道描述符,所述通 道描述符包括通道的基地址、通道的大小以及通道的读写指针。
8.如权利要求7所述的通信装置,其特征在于,所述发送单元,将所述消息写入内存的通道时,还用于将该通道的写指针指向该通 道的下一个可用单元;所述接收单元,还用于判断所述通道的读、写指针是否相等,当所述通道的读、 写指针不相等时,读取所述传输消息的消息头,并将该通道的读指针指向下一个传输消 肩、ο
9.如权利要求6至8任一项所述的通信装置,其特征在于,所述处理单元,在所述消息头中配置下一跳地址,所述下一跳地址表示下一个传输 消息的消息头的起始地址。
10.如权利要求9所述的通信装置,其特征在于,所述处理单元,在所述内存的通道底部空闲空间小于所述传输消息的长度,且所 述通道顶部空闲空间大于所述传输消息的长度时,还用于向所述发送单元发送一空消息 头,其中,所述空消息头中消息体的长度为零,下一跳地址为零;所述发送单元,还用于接收所述处理单元发送的空消息头,并将所述空消息头写入 所述通道的底部,将所述传输消息写入所述通道的顶部,以及在读取到空消息头时,再 从所述通道的顶部读取传输消息,并将所述传输消息的消息体发送给所述处理单元。
全文摘要
本发明公开了一种基于共享内存的通信方法及装置,涉及通信技术领域。本发明公开的通信方法包括发送方将所要发送的内容作为消息体写入内存的通道,并为该消息体配置定长的消息头以构成传输消息,其中,所述消息头中至少携带所述消息体的长度;接收方从所述通道中读取所述消息头,根据所述消息头的起始地址以及消息头的长度确定所述消息体的起始地址,再根据所述消息体的起始地址以及所述消息头中消息体的长度,确定所述消息体在所述内存通道的位置,在该位置上读取所述消息体,进行处理。采用本发明技术方案后,可支持多通道,可支持可变长消息。
文档编号G06F15/167GK102023961SQ20091017213
公开日2011年4月20日 申请日期2009年9月10日 优先权日2009年9月10日
发明者秦晓辉 申请人:中兴通讯股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1