在通信队列管理中通过发送事件触发队列管理的方法

文档序号:6400635阅读:174来源:国知局
专利名称:在通信队列管理中通过发送事件触发队列管理的方法
技术领域
本发明涉及通信技术,尤其涉及一种在通信队列管理中通过发送事件触发队列管理的方法。
背景技术
目前,大多数通信单元(通信芯片,以下简称CU)与CPU之间的数据交互,都会采用队列方式进行管理。队列管理的优劣直接影响CPU的处理性能。CU都具有数据接收和发送的特性,因此CU与CPU之间常使用两个队列进行数据交互-发送队列和接收队列。相对于CPU而言,发送队列指CPU传递数据给CU的通道,而接收队列则是指CU传递数据给CPU的通道;发送队列和接收队列都是相对的,相对于CU而言,发送队列则是指经由CU传递到CPU的数据通道(下文所提到的“发送队列”都是相对于CPU而言的)。
数据在队列中传递时,常常会被封装在数据描述符(简称BD)中,BD中除了包含数据外,还会包含其他的控制信息和描述信息(以下使用BD来表示数据及其控制信息)。
BD不会凭空的产生,也不会凭空的消失,因此CPU将BD放入发送队列后,需要等待CU进行处理,只有待CU完成对BD的处理后,CPU才能将BD释放,以便将来再次使用。现有技术中,CPU释放BD的方法有两种,中断触发方式和定时查询方式。
1、中断触发方式,是指CU在完成对BD的处理后,CU产生中断请求给CPU,CPU在未屏蔽该中断的情况下,对中断进行响应。然后由操作系统运行中断处理函数或者其他任务,完成对BD的释放。
由于中断触发方式,需要CPU响应CU的中断。然而,CPU响应中断的过程对操作系统的影响是惊人的,包括分析中断、响应中断、进行中断与任务间的切换等操作,这一部分时间已经远远超过了CPU释放BD所需要的时间。因此,使用中断触发方式,将会严重影响CPU有效使用率,大大降低系统性能。
一项统计显示,在VXWORKS(由Wind River公司设计的嵌入式实时操作系统)嵌入式实时操作系统环境中,使用750MHz的CPU,如果每秒中那产生148k次中断,CPU将会使用16%的时间去完成中断响应和中断与任务间的切换操作。然而,CPU却只需要不到1%的时间去完成148k次BD的释放工作。
2、定时查询方式,是指CPU启动定时器,在定时结束时,触发CPU去查询发送队列,释放发送队列中被处理后的BD。从软件角度阐述,则是指基于CPU运行的操作系统,启动一个软件定时器,定时触发一个任务去查询发送队列,释放发送队列中被处理后的BD。
该方法存在以下缺点(1)如果在定时期间,并没有BD在发送队列中,那么定时结束后,CPU查询发送队列的操作则是空操作,因此会影响系统的效率。
(2)定时查询方式与中断触发方式一样,CPU除了要释放发送队列中的BD外,还要花费很多时间去处理定时器中断,任务切换等操作,这样会大大降低系统的性能。
(3)如果定时器的精度不够,那么在定时结束前,如果队列已经溢出,则会造成大量的通信数据丢失,损失更大;如果定时器精度过高,则会造成上述(1)和(2)中大量的系统资源被消耗的情况。

发明内容
本发明提供一种在通信队列管理中通过发送事件触发队列管理的方法,以解决现有技术在通信队列管理过程中存在影响系统效率和性能的问题。
为解决上述问题,本发明提供以下技术方案一种在通信队列管理中通过发送事件触发队列管理的方法,所述队列用于传递控制单元之间的交互数据,队列中的数据采用数据描述符封装;该方法为(1)使用第一指针指向可以用于封装发送数据的数据描述符,使用第二指针指向发送队列中已封装数据的数据描述符;(2)发送数据的控制单元在发送数据前先检查第二指针指向的数据描述符中的数据是否发送完毕;如果是则进行步骤(3),否则停止此次数据发送;(3)释放第二指针指向的数据描述符,使用第一指针指向的数据描述符封装需要发送的数据并放入发送队列;以及(4)更新第一指针和第二指针,使第一指针指向下一个可以用于封装发送数据的数据描述符,使第二指针指向下一个已封装数据的数据描述符。
其中所述队列为固定长度的环形队列或动态可变长度的队列。
第二指针指向的数据描述符是已封装数据的数据描述符中最先发送数据的数据描述符。
当所述队列采用固定长度的环形队列时第一指针指向发送队列中可以用于封装发送数据的数据描述符;第一指针和第二指针在队列中的位置之间始终保持一个或多个可以用于封装发送数据的数据描述符的间距;在队列初始化时,除了第一指针指向的数据描述符外,为队列中其他所有数据描述符填充发送数据,并且数据描述符中设定这些数据已经发送完成。
当所述队列采用动态可变长度的队列时第一指针指向数据描述符资源池中可以用于封装发送数据的数据描述符,待封装数据后,数据描述符及其数据被压入数据队列;第二指针指向的数据描述符被释放后,放入所述的数据描述符资源池。
采用本发明,控制单元(如CPU等)在发送数据时,只需要通过判断已封装数据的数据描述符是否发送完毕即可,不仅能够避免中断对控制单元产生的额外负荷,还可以减少操作系统进行任务切换时的额外负荷和冗余开销;从而大幅度提高控制单元的有效利用率,提高整个系统性能。


图1A、图1B为CPU与CU之间使用发送队列通信的示意图;
图2为固定长度的环形发送队列初始化状态示意图;图3为固定长度的环形发送队列运行状态示意图;图4为固定长度的环形发送队列即将溢出的状态示意图。
图中,N-表示发送数据描述符中不包含发送数据,处于空闲状态;Y-表示发送数据描述符中包含发送数据;Y.F-表示发送数据描述符中的数据已完成发送,可以释放;Y.U-表示发送数据描述符中的数据未完成发送,不能释放。
具体实施例方式
在两个控制单元之间,如中央处理器(CPU)与通信单元(CU)之间,使用队列进行数据交互时,发送侧将数据入队列,并能即时通知接收侧进行数据接收处理。但是如果发送的数据资源需要回收释放,那么发送侧就需要等待数据发送完毕后,才能进行数据资源回收释放。本发明采用发送事件触发方式来使发送侧获知数据已发送完毕。
本实施例以CPU与CU之间的数据交互为例进行说明,下文提及的发送队列是指数据经由CPU到CU的队列通道。
由于CPU使用发送队列与CU进行通信而将发送数据压入发送队列时,需要将数据封装在发送队列使用的数据描述符(简称TxBD)中,因此在发送队列处理过程中,TxBD是一个基本的处理单元,数据是否发送完毕,都可以从TxBD的状态得到反馈。
发送事件触发方式是指CPU在每次发送数据时,检查并释放发送队列中已经发送完毕的TxBD,对于已经发送完毕的TxBD,可以通过TxBD的状态字或状态位来判断,TxBD的状态字或状态位由TxBD的结构定义所限定。
使用发送事件触发方式管理发送队列时,要求发送队列包含两个管理指针即第一指针和第二指针,第一指针(以下称InsertPointer)用于标注当前可用于数据发送的TxBD;第二指针(以下称FreePointer)用于标注已封装数据并将要释放的TxBD。当CPU发送数据时,首先检查FreePointer指向的TxBD是否发送完毕,如果发送完毕,则释放FreePointer指向的TxBD,并将FreePointer指向下一个已封装数据并将要释放的TxBD,然后使用InsertPointer指向的TxBD封装发送数据并执行数据发送。如果FreePointer指向的TxBD仍处于使用状态,则停止发送过程,返回队列溢出信息。
参阅图1A所示,CPU与CU之间使用可变长度的发送队列通信,这种队列类似一个管道(pipe),CPU使用InsertPointer从发送数据描述符资源池中取出一个发送数据描述符并封装需要发送的数据,然后压入发送队列,如果这是第一个压入发送队列的数据描述符,那么CPU的FreePointer就指向该数据描述符。CU则使用自己的指针CU.pointer从发送队列中读取最新的发送描述符进行发送。在下一次CPU发送数据时,则会判断FreePointer指向的数据描述符的状态是否为已经发送完成,如果发送完成则将该数据描述符释放回资源池。
参阅图1B所示,CPU与CU之间使用固定长度的环形发送队列通信。这种队列在初始化时,已经包含了若干个发送数据描述符,这些发送数据描述符相互串连,形成环形队列。CPU使用InsertPointer指向的数据描述符来封装需要发送的数据,判断FreePointer指向的数据描述符是否完成发送,完成发送则释放发送描述符中的封装数据。CU则使用自己的指针CU.pointer从发送队列中读取发送数据描述符,如果发送数据描述符中封装的数据正在等待发送,则将其中的数据发送出去。
如图2所示,发送队列初始化时,发送队列中所有的TxBD都是空闲状态,空闲状态也可以视为发送完毕状态,即TxBD中的数据已经完成发送。空闲状态的TxBD才可以再次被用于封装发送数据。而发送队列管理使用的两个指针InsertPointer和FreePointer,位置如图2所示,FreePointer指针指向的TxBD是InsertPointer指针指向TxBD的下一个单元。在运行过程中,FreePointer指针与InsertPointer指针始终保持这样的相对位置关系。
在初始化发送队列时,需要为队列中除了InsertPointer指向的TxBD外其余所有的TxBD填充发送数据并且指定发送数据描述符的状态为已经发送完成(即CU无需发送这些数据)。这些数据不是为了发送,而是为了释放。因为,在发送队列初始化状态下,如果发送数据,则需要释放FreePointer指向的TxBD,如果此TxBD中没有可以释放的数据,则会产生异常。InsertPointer指向的TxBD不能填充数据是因为InsertPointer指向的TxBD必须处于空闲而且已经释放的状态,该TxBD需要用来填充待发送的新数据。
初始化发送队列时,从队列索引方向上,FreePointer指针在InsertPointer指针前面,两个指针之间的间距大于等于1个TxBD单元。而且,在发送过程中,InsertPointer指针与FreePointer指针之间始终保持固定的间距,以确保InsertPointer指针指向的TxBD是空闲状态;发送队列在初始化状态下,CPU发送数据时首先检查FreePointer指向的TxBD,判断此TxBD是处于空闲状态,即此TxBD中的数据已经发送完毕,如果是,CPU则释放FreePointer指向的TxBD,释放的内容和过程则是根据使用者的实际应用而定(释放的内容和过程并不是重点,因为本发明描述的重点是触发释放事件,具体的释放操作,或者其他相关操作则由应用者决定)。完成FreePointer指向TxBD的释放后,需要及时更新FreePointer指针,即将FreePointer指向下一个已封装数据并将要释放的TxBD。
成功释放了FreePointer指针指向的TxBD后,就可以进行此次数据发送。CPU随后便可以使用InsertPointer指向的TxBD封装待发送的数据,然后通知CU执行发送,并更新InsertPointer指向下一个可用于数据发送的TxBD。
当进行了若干次数据发送后,发送队列中各TxBD的状态如图3所示,CPU判断FreePointer指向的数据描述符已经完成发送,则释放该数据描述符中封装的数据,此数据描述符进入“N”状态,FreePointer向前移动一个位置。CPU再使用InsertPointer指向的数据描述符封装需要发送的数据,这个数据描述符则从状态“N”变成了状态“Y.U”,即等待CU发送,InsertPointer也向前移动一个位置。CU从发送队列中读取待发送的数据描述符后,完成发送,设置发送描述符的状态为“Y.F”,说明这个发送描述符中的数据可以释放。
在运行过程中,可以看到FreePointer指针与InsertPointer指针始终保持这种相对状态,即FreePointer指针与InsertPointer指针始终保持同步更新。
FreePointer指针与InsertPointer指针之间的这种相对关系,可以保证InsertPointer指针指向的TxBD始终是处于空闲状态,可以用于封装将要发送的数据。CPU无需再次判断InsertPointer指针指向的TxBD状态,只需要通过判断FreePointer指针指向的TxBD是否发送完毕即可。
如果CPU发送数据时,检查FreePointer指针指向的TxBD,发现此TxBD中的数据仍未完成发送,则表示此时发送队列即将溢出,不能再填充新的发送数据。此时,发送队列中各TxBD的状态如图4所示。
当发送队列处于即将溢出状态时,FreePointer指针指向的TxBD中的数据还没有发送完毕,因此这时如果CPU再次发送数据,CPU检查FreePointer指针时,就要返回错误,即停止此次数据发送并返回发送队列溢出状态的信息。虽然此时InsertPointer指针指向的TxBD处于空闲状态,但是为了保证InsertPointer指向的TxBD始终保持空闲状态,此时就不能使用InsertPointer指向的TxBD封装待发送数据,必须等待CU完成一个数据发送后,CPU才能再次发送一个数据。
图4中,环形发送队列即将溢出的原因是CPU向发送队列中填充数据的速度大大超过了CU从发送队列中读取并发送数据的速度,造成发送数据队列中除了InsertPointer指向的数据描述符外,其他的数据描述符都封装了待发送的数据,即其他的发送数据描述符都处于“Y.U”状态,包括FreePointer指向的数据描述符。如果此时CPU仍需要继续发送数据,判断FreePointer指向的数据描述符状态时,发现其中的数据没有完成发送,发送队列已经将要溢出,CPU就需要停止发送。
当采用动态可变长度的队列时,第一指针InsertPointer指向数据描述符资源池中可以用于封装发送数据的数据描述符,待封装数据后,数据描述符及其数据被压入数据队列。第二指针FreePointer指向的数据描述符被释放后,放入所述的数据描述符资源池。队列初始化时可以没有任何的数据描述符,即设置为空队列。其实现与上述采用固定长度的发送队列实现同理。
本发明使用发送事件触发式,对发送队列进行管理,不仅仅局限于释放发送队列中的数据,还可以应用于队列的其他管理,或相关统计,如数据交互的成功/失败次数统计等等。
本发明所提及的“发送队列”和“接收队列”具有泛指含义,所有使用队列进行数据交互的应用中,都会由“发送队列”和“接收队列”的概念。而且“发送队列”与“接收队列”是一组可以相互转化的概念,例如,CPU的“接收队列”实际上可以视为CU的“发送队列”。因此,凡是可以使用“发送队列”这个概念的场合,均可以使用本发明的方法。
权利要求
1.一种在通信队列管理中通过发送事件触发队列管理的方法,所述队列用于传递控制单元之间的交互数据,队列中的数据采用数据描述符封装;其特征在于包括步骤(1)使用第一指针指向可以用于封装发送数据的数据描述符,使用第二指针指向发送队列中已封装数据的数据描述符;(2)发送数据的控制单元在发送数据前先检查第二指针指向的数据描述符中的数据是否发送完毕;如果是则进行步骤(3),否则停止此次数据发送;(3)释放第二指针指向的数据描述符,使用第一指针指向的数据描述符封装需要发送的数据并压入发送队列;以及(4)更新第一指针和第二指针,使第一指针指向下一个可以用于封装发送数据的数据描述符,使第二指针指向下一个已封装数据的数据描述符。
2.如权利要求1所述的方法,其特征在于,所述队列为固定长度的环形队列或动态可变长度的队列。
3.如权利要求1或2所述的方法,其特征在于,第二指针指向的数据描述符是已封装数据的数据描述符中最先发送数据的数据描述符。
4.如权利要求3所述的方法,其特征在于,当所述队列采用固定长度的环形队列时,第一指针指向发送队列中可以用于封装发送数据的数据描述符。
5.如权利要求4所述的方法,其特征在于,当所述队列采用固定长度的环形队列时,第一指针和第二指针在队列中的位置之间始终保持一个或多个可以用于封装发送数据的数据描述符的间距。
6.如权利要求3所述的方法,其特征在于,当所述队列采用固定长度的环形队列时,在队列初始化时,除了第一指针指向的数据描述符外,为队列中其他所有数据描述符填充发送数据,并且在数据描述符中设定这些数据已经发送完成。
7.如权利要求3所述的方法,其特征在于,当所述队列采用动态可变长度的队列时,第一指针指向数据描述符资源池中可以用于封装发送数据的数据描述符,待封装数据后,数据描述符及其数据被压入数据队列。
8.如权利要求7所述的方法,其特征在于,第二指针指向的数据描述符被释放后,放入所述的数据描述符资源池。
9.如权利要求7所述的方法,其特征在于,在可变长度的队列初始化时设置为空队列。
10.如权利要求1所述的方法,其特征在于,在步骤(2)中,停止该次数据发送后返回队列溢出信息并等待再次发送。
全文摘要
本发明公开了一种在通信队列管理中通过发送事件触发队列管理的方法,以解决在通信队列管理过程中存在影响系统效率的问题。该方法为使用第一指针指向可以用于封装发送数据的数据描述符,使用第二指针指向发送队列中已封装数据的数据描述符;发送数据的控制单元在发送数据前先检查第二指针指向的数据描述符,如果该数据描述符中数据已发送完毕则释放数据描述符,然后再使用第一指针指向的数据描述符封装需要发送的数据并入发送队列;以及更新第一指针和第二指针,使第一指针指向下一个可以用于封装发送数据的数据描述符,使第二指针指向下一个已封装数据的数据描述符。
文档编号G06F9/46GK1690967SQ20041003882
公开日2005年11月2日 申请日期2004年4月30日 优先权日2004年4月30日
发明者王伟, 张健 申请人:华为技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1