专利名称:一种基于共享存储器的双cpu通信方法
技术领域:
本发明涉及一种通信技术领域的通信方法,具体涉及的是一种基于共享
存储器的双CPU通信方法。
背景技术:
在现有技术的两个CPU之间通过共享存储器通信时,目前丰支常见的有
两种方法。
一种方法是将共享存储区划分为两块,分别作为两个CPU的发送、接
收通道,如
图1所示。每个通道提供一个读写标志位,该标志初始为可写 态。发送方发送数据后将读写标志由可写态修改为可读态,等待接收方接 收。接收方接收数据后将读写标志由可读态修改为可写态,以便发送方可 以继续发送。采用这种方法,每一次的数据交互都需要等待对方读或写完 毕,效率很低。
另一种方法也是将共享存储区分为两块,分别作为两个CPU的发送、 接收的通道,每个通道用一个环形队列实现循环读写,如图2所示。环形 队列通过存放在邮箱中的读写指针进行管理。以CPU1发送为例,CPU1有
数据需要发送时,首先通过环形队列1的读、写指针计算是否有足够的剩 余空间,如果空间足够,则将消息包写入写指针所指位置,并更新写指针。
CPU2定时轮询环形队列1,发现有新的消息包时,则读取消息包,并更新 读指针。由于发送方和接收方可以同时操作共享存储区,比前述方法在效 率上大大提高。
但是还是存在以下问题 (1)数据一般按定长打包发送,对于消息包长度相差大,例如最小长
度为4字节,最大长度为40字节,都要按最大的40字节打包发送,造成浪费。
(2) 数棍不接定长打包发送时,需要在消息包中包含长度信息,由于 消息包不定长,接收方无法通过读写指针计算出待处理的消息条数。
(3) 消息包不定长时,在连续发送消息的过程中,其中某条出现故障 将引起后面的读写指针全部紊乱。
(4) 在队列尾端空间不够存放新消息包时, 一般为了操作方便不允许 消息包巻绕,就需要填充特殊值(例如0xFFFF)指示该尾端空间无效,并 将消息包放置到队列头部。接收时需要和特殊值比较,判断是正常消息包 还是巻绕时的填充值。如果正常消息包中包含特殊值,就会产生冲突。
因此,现有技术还有待于改进和发展。
发明内容
本发明的目的在于提供一种基于共享存储器的双CPU通信方法,针对 前述两种方法的缺点,提供了一种支持可变消息长度,高效、可靠的双CPU 通信方法。
本发明的技术方案如下
一种基于共享存储器的双CPU通信方法,在第一 CPU和第二 CPU之间 存在双向传输通道,每一通道使用两个环形队列, 一个用于存放消息索引, 一个用于存放消息实体;并且每一通道传输过程包括以下步骤
A、 初始化流程通信前完成本CPU负责的队列读写指针的初始化;
B、 发送消息流程将新消息实体写入消息实体队列,并更新消息实体 队列写指针,即指向新消息实体之后的可用单元;更新消息索引队列写指 针所指单元的内容,指向消息实体队列中的新消息实体,并更新消息索引 队列写指针指向下一单元;
C、 接收消息流程消息索引队列读指针前移一个单元,根据该单元中
的索引计算待处理消息实体的读指针,并更新消息索引队列读指针;读取 待处理消息实体并处理。
所述的方法,其中,所述步骤A还包括
写指针指向队列头部第一个单元,读指针指向队列尾部最后一个单元。 所述的方法,其中,所述步骤B还包括
BOl、根据消息实体队列读、写指针和消息实体队列大小,判断是否可 以写入新消息实体;是,则继续;否,则延迟后再发;
B02、根据消息索引队列读、写指针和消息索引队列大小,判断是否可 以写入新消息索引;是,则继续;否,则延迟后再发。
所述的方法,其中,所述步骤C还包括
COl、根据消息索引队列读、写指针和消息索引队列大小,计算待处理 消息条数,如果没有消息处理则返回。
所述的方法,其中,所述步骤C中,所述消息索引队列读指针前移一个 单元时,如果前移到达消息索引队列大小则回绕到0。
所述的方法,其中,所述步骤C中还包括
C02、更新消息实体队列读指针;
C03、待处理消息条数减1;
循环处理直到待处理消息条数为0。
所述的方法,其中,所述消息索引是大小固定为4字节、指向消息实体 的指针;所述消息实体大小可变。
所述的方法,其中,所述每个环形队列通过存放在邮箱中的读写指针管 理,写指针表示发送方可写,接收方只读;读指针表示发送方只读,接收 方可写。
所述的方法,其中,对所述邮箱采用镜像保护,以避免指针的同时读 写冲突。
所述的方法,其中,所述发送方发送消息的同时,通过中断产生和控制
装置设置对方的中断状态标志位;所述接收方通过响应中断接收,或用轮 询的方式接收。
本发明所提供的一种基于共享存储器的双CPU通信方法,与现有技术 相比,由于在共享存储器中引入索引队列和实体队列,减少了发送方和接 收方的等待时间,减少了接收方重复进中断或查询的次数,提高了CPU的 利用率,提高了数据吞吐量和处理速度,能够支持可变消息长度,高效、 可靠,尤其适用于消息流量大、且消息包不定长的情况。
附图i兌明
图1是现有技术的共享存储器的双CPU通信示意图; 图2是现有技术的每个通道用 一个环形队列的双CPU通信示意图; 图3是本发明所述方法中的每个通道用两个环形队列的双CPU通信示 意图4是本发明所述方法中的消息索引与消息实体关系示意图; 图5是作为本发明具体实施方式
的双CPU通信示意图; 图6是作为本发明具体实施方式
的邮箱分配示意图; 图7示例了典型情况下的待处理消息条数计算示意图。
具体实施例方式
下面结合具体实施方式
对本发明所述方法作进一步的描述。 本发明的基于共享存储器的双CPU通信方法,如图3和图4所示的, 为了描述方便,定义CPU1发送、CPU2接收的通道为正向通道,CPU2发 送、CPU1接收的通道为反向通道。正向通道和反向通道各使用了两个环形 队列, 一个用于存放消息索引, 一个用于存放消息实体;消息索引是大小 固定为4字节、指向消息实体的指针,消息实体大小可变。
每个环形队列通过存;^文在邮箱中的读写指针管理,写指针表示发送方可
写,接收方只读。读指针表示发送方只读,接收方可写。对邮箱采用镜像 保护,可以完全避免指针的同时读写冲突问题。
本发明方法中发送方发送消息的同时,可以通过中断产生和控制装置, 设置对方的中断状态标志位,接收方可以通过响应中断接收,也可以用轮 询的方式接收。
根据系统需要,分别设定正向通道和反向通道的消息索引队列大小和消
息实体队列大小。在两个CPU的处理程序中包含如下三个基本流程 第一部分,初始化流程
通信前完成本CPU负责的队列读写指针的初始化,写指针指向队列头 部第一个单元,读指针指向队列尾部最后一个单元。 第二部分,发送消息流程
(1) 根据消息实体队列读、写指针和消息实体队列大小,判断是否可 以写入新消息实体。是,则继续;否,则延迟后再发。
(2) 根据消息索引队列读、写指针和消息索引队列大小,判断是否可 以写入新消息索引。是,则继续;否,则延迟后再发。
(3) 将新消息实体写入消息实体队列,并更新消息实体队列写指针, 即指向新消息实体之后的可用单元。
(4) 更新消息索引队列写指针所指单元的内容,指向消息实体队列中 的新消息实体,并更新消息索引队列写指针,即指向下一单元。
第三部分,接收消息流程
(1 )才艮据消息索引队列读、写指针和消息索引队列大小,计算待处理 消息条数。如果没有消息处理则返回。
(2) 消息索引队列读指针前移一个单元,如果前移到达消息索引队列 大小则回绕到O,根据该单元中的索引计算待处理消息实体的读指针,并更 新消息索引队列读指针。
(3) 读取待处理消息实体并处理。
(4) 更新消息实体队列读指针。
(5) 待处理消息条数减1。
(6) 继续第(2)歩,直到待处理消息条数为O。
(7) 继续第(1)步。
在本发明的具体实施例中,如图5所示,C6xDSP和ARM9使用共享存 储器和邮箱来实现消息交互。共享存储区被分为正向消息索引队列、正向 消息实体队列、反向消息索引队列、反向消息实体队列共4个緩沖区。正 反向消息队列的读写都以循环的方式进行操作,循环读写所用的指针通过 邮箱进行交互。
邮箱有两组,分别称为读入邮箱和写出邮箱(从ARM9角度称呼)。读 入邮箱是一个双口的寄存器堆,连接DSP的端口是可读写的,连接ARM 的端口是只读的。写出邮箱也是一个双口的寄存器堆,不过连接DSP的端 口是只读的,而连接ARM的端口是可读写的。两组邮箱寄存器堆内部双端 口均设有各自的镜象寄存器以支持双端口同时读写,因此可以完全避免指 针的同时读写冲突问题。
两组邮箱在写访问时会产生中断,对读入邮箱写访问会通过ARM中断 控制器产生中断通知ARM,用于DSP向ARM发送消息。对写出邮箱写访 问会通过DSP中断控制器产生中断通知DSP,用于ARM向DSP发送消息。 接收方可以通过响应中断接收,也可以用轮询的方式接收。
通过复位控制器可以提供故障恢复机制以DSP为主控端,DSP检查 到队列满,则等待ARM处理并计时,超过限定时间队列仍为满则视为ARM 已死机,通过复位使ARM恢复正常。
本发明方法中消息索引队列的读写以循环的方式进行以下搡作
(1) 初始化时,队列的写指针指向队列头部第一个单元,读指针指向 队列尾部最后一个单元。
(2) 指针从头部往尾部移动,当到达最后一个单元时,又回复到队 头部,如此循环。
(3) 写队列时,从写指针所指位置写;读队列时,读指针前移一个单 元再读。
(4) 写队列时,根据读写指针差别判断是否可以写入。
(5) 读指针追赶写指针,并且保证读指针与写指针之间相差至少一个 单元。计算待处理消息条数时,需要减去此单元。
消息实体队列的读写也是以循环的方式进行操作。当发送消息时,如果 已经到达消息实体队列尾端并且尾端空间不够,则移到队列头操作。由于 存放消息实体时,同时把其地址存放到消息索引队列中,因此接收方按消 息索引即可取到消息实体地址,无需关心消息实体队列是否发生巻绕。
根据消息索引队列读、写指针和消息索引队列大小,可以计算出待处理 消息条数
如果写指针 > 读指针,则待处理消息条数=写指针-读指针-1; 如果写指针 < 读指针,则待处理消息条数=队列大小-读指针+写 指针-1。
图7示例了本发明方法在典型情况下的待处理消息条数计算。图7(a)所 示为消息索引队列初始化时的情况,此时待处理消息条数为0。图7(b)所示 为写指针 > 读指针的情况,阴影部分为待处理消息的索引。图7(c)所示为 读指针 > 写指针的情况,阴影部分为待处理消息的索引,此时写指针已经 从队列尾回绕到队列头。图7(d)所示为待处理消息条数等于0的情况。
下面具体说明本发明方法的具体实施例中DSP到ARM的消息传送过
程,ARM到DSP的消息传送过程与此类似。
为了发送消息到ARM,如图6所示,DSP按以下步骤完成相关搡作
(1) DSP从读入邮箱读取正向消息索引队列写指针、消息实体队列写 指针,从写出邮箱读取正向消息索引队列读指针、消息实体队列读指针。
(2) 才艮据消息实体队列读、写指针和消息实体队列大小,计算可用的
消息实体队列空间,并判断是否足够存放新消息实体。该空间必须连续, 即如果写指针大于读指针,且队列尾部可用空间不够时,计算队列头部可
用空间。如栗空间足够则继续,否则延迟后再发。
(3) 才艮据消息索引队列读、写指针和消息索引队列大小,计算可用的
消息索引队列空间,并判断是否可以写入新消息索引。判断的依据是保证 读指针与写指针之间相差至少一个单元。如果空间足够则继续,否则延迟
后再发。
(4) 将新消息实体写入消息实体队列(从消息实体队列写指针所指单
元开始写),并更新读入邮箱中的消息实体队列写指针(指向新消息实体之 后的可用单元)。
(5) 更新消息索引队列写指针所指单元的内容,指向消息实体队列中 的新消息实体,并更新读入邮箱中的消息索引队列写指针(指向下一单元)。
由于读入邮箱写指针的变化,将触发ARM的中断,ARM按以下步骤从 消息队列读取消息
(1) ARM从读入邮箱读取正向消息索引队列写指针,从写出邮箱读取 正向消息索引队列读指针。
(2) 才艮据消息索引队列读、写指针和消息索引队列大小,计算待处理 消息条数。如果没有消息处理则返回。
(3) 消息索引队列读指针前移一个单元(如果前移到达消息索引队列 大小则回绕到0),才艮据该单元中的索引计算待处理消息实体的读指针。并 更新写出邮箱中的消息索引队列读指针。
(4) 读取4寺处理消息实体并处理。
(5) 更新写出邮箱中的消息实体队列读指针。
(6) 待处理消息条数减1。
(7) 循环继续第(3)步,直到待处理消息条数为0。
(8) 循环继续第(1)步。
综上,本发明的基于共享存储器的双CPU通信方法,支持可变消息长 度;尽管消息实体的大小不同,每条消息都对应一条4字节的消息索引指 向消息实休,因此接收方可通过消息余引读写指针计算出待处理的消息条 数;避免每个通道只用一个环形队列时,在连续发送消息的过程中,其中 某条出现故障引起后面的读写指针紊乱的问题。
本发明方法在处理消息包巻绕时无需填充特殊值,在消息实体队列尾端 空间不够存放新消息包时,直接存放到队列头,其地址存入消息索引队列, 因此接收方按消息索引即可取到消息实体,根本无需关心消息包是否巻绕。
本发明方法避免了指针的同时读写冲突问题;发送方可以连续发送消 息,将多条消息堆积在緩冲区内,接收方可以连续处理緩冲区内的多条消 息。这样就减少了发送方和接收方的等待时间,减少了接收方重复进中断 或查询的次数,提高了CPU的利用率,提高了数据吞吐量和处理速度。
应当理解的是,上述针对具体实施例的描述较为详细,并不能因此而认 为是对本发明专利保护范围的限制,本发明的专利保护范围应以所附权利 要求为准。
权利要求
1、一种基于共享存储器的双CPU通信方法,在第一CPU和第二CPU之间存在双向传输通道,每一通道使用两个环形队列,一个用于存放消息索引,一个用于存放消息实体;并且每一通道传输过程包括以下步骤A、初始化流程通信前完成本CPU负责的队列读写指针的初始化;B、发送消息流程将新消息实体写入消息实体队列,并更新消息实体队列写指针,即指向新消息实体之后的可用单元;更新消息索引队列写指针所指单元的内容,指向消息实体队列中的新消息实体,并更新消息索引队列写指针指向下一单元;C、接收消息流程消息索引队列读指针前移一个单元,根据该单元中的索引计算待处理消息实体的读指针,并更新消息索引队列读指针;读取待处理消息实体并处理。
2、 根据权利要求1所述的方法,其特征在于,所述步骤A还包括写指针指向队列头部第 一个单元,读指针指向队列尾部最后一个单元。
3、 根据权利要求2所述的方法,其特征在于,所述步骤B还包括 BOl、根据消息实体队列读、写指针和消息实体队列大小,判断是否可以写入新消息实体;是,则继续;否,则延迟后再发;B02、根据消息索引队列读、写指针和消息索引队列大小,判断是否可 以写入新消息索引;是,则继续;否,则延迟后再发。
4、 根据权利要求3所述的方法,其特征在于,所述步骤C还包括 COl、 #4居消息索引队列读、写指针和消息索引队列大小,计算待处理消息条数,如果没有消息处理则返回。
5、 根据权利要求4所述的方法,其特征在于,所述步骤C中,所述消 息索引队列读指针前移一个单元时,如果前移到达消息索引队列大小则回绕 到0。
6、 根据权利要求5所述的方法,其特征在于,所述步骤C中还包括 C02、更新消息实体队列读指针;C03、持处理消息条数减l; 循环处理直到待处理消息条数为0。
7、 根据权利要求l-6任一所述的方法,其特征在于,所述消息索引是大 小固定为4字节、指向消息实体的指针;所述消息实体大小可变。
8、 根据权利要求7所述的方法,其特征在于,所述每个环形队列通过存 放在邮箱中的读写指针管理,写指针表示发送方可写,接收方只读;读指针 表示发送方只读,接收方可写。
9、 根据权利要求8所述的方法,其特征在于,对所述邮箱采用镜像保护, 以避免指针的同时读写冲突。
10、 根据权利要求8所述的方法,其特征在于,所述发送方发送消息的 同时,通过中断产生和控制装置设置对方的中断状态标志位;所述接收方通 过响应中断接收,或用轮询的方式接收。
全文摘要
本发明公开了一种基于共享存储器的双CPU通信方法,在第一CPU和第二CPU之间存在双向传输通道,每一通道使用两个环形队列,一个用于存放消息索引,一个用于存放消息实体;并且每一通道传输过程包括以下步骤初始化流程通信前完成本CPU负责的队列读写指针的初始化;发送消息流程将新消息实体写入消息实体队列,并更新消息实体队列写指针,即指向新消息实体之后的可用单元;更新消息索引队列写指针所指单元的内容,指向消息实体队列中的新消息实体,并更新消息索引队列写指针指向下一单元;接收消息流程。本发明方法由于在共享存储器中引入索引队列和实体队列,支持可变消息长度,减少了发送方和接收方的等待时间,提高了CPU的利用率,提高了数据吞吐量和处理速度。
文档编号G06F15/167GK101105786SQ20061010323
公开日2008年1月16日 申请日期2006年7月14日 优先权日2006年7月14日
发明者官华伯, 张绪广, 帷 江 申请人:中兴通讯股份有限公司