背景技术
近年来,随着需要传输的数据流量越来越大,通信系统对带宽的要求变得越来越高,同时,导致芯片上的高速接口与内部模块之间的接口数据的处理速度也越来越快。在通信系统中,接口并不仅仅需要传输一种类型的数据,通常情况下,同一个接口需要传输很多类型的数据。为了充分利用接口的带宽,对不同类型数据进行高效的管理,发送方一般可以根据不同类型的数据包进行调度管理,接收方则需要对不同类型的包进行存储管理。
1、从发送方的角度看,接口在发送多种类型的数据包的时候,通常会面临如何安排不同类型的数据包的优先级的问题。这是因为有些类型的数据包实时性要求高,有些类型的数据包实时性要求低,在对各类型的数据包进行传输前,系统需要给不同类型的数据包分配不同的优先级:优先级高的数据包具有优先被发送的权利,而优先级低的数据包则可以安排在优先级高的数据包发送完之后再被发送。但是,这样往往导致优先级低的数据包往往在发送过程中被多次打断而延迟很久才能被发送出去。
2、从接收方的角度看,接收方接收到的不同类型的数据包通常并不是按照一定顺序发送过来的。由于同一种类型的数据包的优先级是一样的,系统能够保证将同一种类型的数据包按照顺序发送,但是系统可能将不同类型的数据包按照顺序发送,造成接收方接收到的不同功能类型的数据包是乱序的。另外,由于在发送方处优先级低的数据包可能被打断很多次才能发出,这也导致接收方在对接收到的数据包进行存储管理时产生了很大的不便。
由于很多数据包的数据量都比较大,所以一般需要将数据包分多次进行传输,而数据包里面的数据很多情况下是相互关联的,如果需要完成某种运算或者任务,往往需要把数据包里面的所有数据收集齐才能进行运算等操作。由此可见,对数据包里的包数据进行收集和存储尤为重要,如果同一个数据包的包数据能够被连续传输,则数据的收集就比较简单,但是,如果同一个数据包的包数据被传输的过程中被优先级较高的数据包抢断时,则容易导致该数据包的包数据被间隔传输,从而造成数据的收集的复杂。
对于上述问题,现有技术中目前比较通用的解决方法是根据数据包的包类型标识(ID)最大数在接收方开辟独立的存储空间,每个标识(ID)对应一个单独的存储空间。接收方一旦收到发送方传输过来的数据包立即根据数据包的ID号找到其对应的存储空间进行存储,一旦某个类型的数据包接收完成时,则向内部处理模块发送中断信息,通知内部处理模块该ID号的数据包已经完成收集,可以处理了,内部处理模块只需要根据ID号到对应的包数据存储空间读取数据。如果当前情况下,有多种类型的数据包都接收完了,那么内部处理模块一般会按照数据包的优先级大小的顺序进行处理。
上述方法确实能够保证数据包的处理效率,但其存在的最大问题在于数据包的接收存储是根据每个数据包ID来开辟数据包的存储空间的,而且每个ID对应的存储空间必须按照最大流量来开辟,因为发送方很有可能在某段时间内一直发某个ID数据包,而其他ID的存储空间在这段时间内一直处于空闲状态,因此,这种包数据的接收和存储方法很容易造成随机存取内存(RAM)资源的巨大浪费。同时,在数据包的传输过程中,由于包处理有时间限制(或者包传输出错),接收方为了不浪费处理时间,需要对超过处理时间或传输出错的数据包进行丢弃处理。
针对相关技术中为了解决数据包乱序和数据包断续传输导致的数据包存储管理复杂的问题而采取的在接收方开辟独立的存储空间的方法,但同时容易造成RAM资源的浪费及丢弃数据包的问题,目前尚未提出有效的解决方案。
发明内容
本发明的主要目的在于提供一种存储方法及装置,以至少解决上述问题之一。
根据本发明的一个方面,提供了一种数据存储方法,包括:接收方接收发送方发送的当前数据包的当前包数据,其中,当前包数据携带有当前数据包的包类型标识ID;接收方根据包类型ID从地址缓存区中读取当前包数据的上一份包数据在数据缓存区中的第一存储地址,将第一存储地址、当前包数据作为新的包数据存储到数据缓存区;接收方记录新的包数据在数据缓存区中的第二存储地址,将第二存储地址添加到对应于包类型ID的地址缓存区。
优选地,在接收方接收发送方发送的当前数据包的当前包数据之后,包括:接收方根据其接收到的当前数据包的当前包数据携带的包起始状态标志确定当前包数据为当前数据包中的第一份包数据;接收方判定当前数据包接收开始。
优选地,在接收方接收发送方发送的当前数据包的当前包数据之后,还包括:接收方根据其接收到的当前数据包的当前包数据中的包结束状态标志确定当前包数据为当前数据包中的最后一份包数据;接收方判定当前数据包接收完成。
优选地,在接收方判定当前数据包接收完成之后,包括:接收方将当前数据包的包状态更新为有效;接收方上报当前数据包为能够被读取的消息。
优选地,在接收方判定当前数据包接收完成后,还包括:接收方根据来自系统的执行命令将当前数据包的包状态更新为无效;接收方上报当前数据包为能够被丢弃的消息。
优选地,在当前数据包接收完成之后,该方法还包括:根据当前数据包的最后一份包数据中的存储地址,以从后往前的顺序依次读取当前数据包的包数据,直至读取到当前数据包的第一份包数据结束。
根据本发明的另一方面,提供了一种数据存储装置,包括:接收模块,用于接收发送方发送的当前数据包的当前包数据,其中,当前包数据携带有当前数据包的包类型标识ID;存储模块,根据包类型ID从地址缓存区中读取当前包数据的上一份包数据在数据缓存区中的第一存储地址,将第一存储地址、当前包数据作为新的包数据存储到数据缓存区;记录模块,用于记录新的包数据在数据缓存区中的第二存储地址,将第二存储地址添加到对应于包类型ID的地址缓存区。
优选地,该装置还包括:判断模块,用于根据当前数据包的当前包数据中携带的包起始状态标识和/或包结束状态标志,确定当前数据包接收开始或接收完成。
优选地,该装置还包括:更新模块,用于在判断模块判断当前数据包接收完成后,将当前数据包的包状态更新为有效。
优选地,接收模块还用于接收系统发送的丢弃当前数据包的执行命令;更新模块还用于根据执行命令将当前数据包的包状态更新为无效。
优选地,该装置还包括:读取模块,用于在当前数据包接收完成之后,根据当前数据包的最后一份包数据中的存储地址,以从后往前的顺序依次读取当前数据包的包数据,直至读取到当前数据包的第一份包数据结束。
通过本发明,采用一种链表式的存储方法对当前数据包的当前包数据进行存储,并且将所有数据包的包数据存储在一个存储空间内,其中,当前包数据中包含上一份包数据中的存储地址,方便了当前数据包接收完成后对当前数据包进行链表式读取,解决了传统存储方法不能够支持乱序包接收、采用大量存储分区数据包导致的存储资源浪费的问题,进而达到了支持乱序包的包内断续传输、节省存储资源的效果。
具体实施方式
下文中将参考附图并结合实施例来详细说明本发明。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。
图1是根据本发明实施例的数据存储方法流程图,如图1所示,该方法主要包括以下步骤(步骤S102-步骤S106):
步骤S102,接收方接收发送方发送的当前数据包的当前包数据,其中,当前包数据携带有当前数据包的包类型标识ID;
在本发明实施例中,在发送方发送当前数据包时可以为每种数据包标注包头的标志用于辨别包的类型,以及标注包的起始和结束标志用于辨别数据包的第一份包数据或者最后一份包数据。接收方接收到来到当前数据包的包数据后,可以根据当前数据包的当前包数据携带的包起始状态标志和/或包结束状态标志确定当前包数据为当前数据包中的第一份包数据或者为当前数据包中的最后一份包数据;如果确定为第一份包数据,则接收方判定当前数据包接收开始,如果确定为最后一份数据包,则接收方判定当前数据包接收完成。
步骤S104,接收方根据包类型ID从地址缓存区中读取当前包数据的上一份包数据在数据缓存区中的第一存储地址,将第一存储地址、当前包数据作为新的包数据存储到数据缓存区;
在本发明实施例中,接收方可以根据包ID从地址缓存区中读取该类型包上一份数据在数据缓存区中的地址信息,并把该地址、数据、包的起始结束标志重新组合存储到数据缓存区中;
步骤S106,接收方记录新的包数据在数据缓存区中的第二存储地址,将第二存储地址添加到对应于包类型ID的地址缓存区。
在本发明实施例中,接收方可以首先记下当前包数据在数据空间中的地址,再把这个新的地址写到对应包类型ID地址的缓存空间中。如果发现数据包的结束标志,则表明整个数据包收集完毕,同时通知内部处理模块来读取数据。
优选地,当接收方判定当前数据包接收完成时,可以将当前数据包的包状态更新为有效,并且上报当前数据包为能够被读取的消息;当然,由于在实际的包数据传输过程中可能出现错误,或者超过包处理时间,系统需要将这些数据包进行丢弃处理,此时,系统可以向接收方发送包丢弃的命令,当接收到包丢弃的命令时,接收方可以根据报丢弃命令将当前数据包的包状态更新为无效,并且上报当前数据包能够被丢弃的消息。
优选地,在当前数据包接收完成,接收方还可以对存储完成的数据进行读取。具体地,可以根据当前数据包的最后一份包数据中的存储地址,以从后往前的顺序依次读取当前数据包的包数据,直至读取到当前数据包的第一份包数据结束。例如,接收方内部的内部处理模块可以根据包类型ID首先从地址缓存区中读取包最后一个数据的存储地址,再根据这个地址到缓存区中读出包的最后一份数据,其中,每份数据都包含上一份数据的存储地址。通过这种链表的方法就可以把该数据包的所有的包数据都读出来,一旦读到数据中包的起始标志有效,则表明该包所有的数据都从缓存区中读出来了。
图2是根据本发明优选实施例一种乱序数据包的链表式存储方法流程图,如图2所示,该流程主要包括以下步骤:
S1,接收方接收到某个数据包的一份包数据并且对包数据进行解析,解析出包类型、包起始标志、包结束标志;
S2,从地址缓存区中读取该数据包上一份包数据所在的存储空间的地址信息;
S3,把上一份的包数据的存储地址、当前数据包的起始状态、结束状态与当前接收到的包数据存储到数据缓存区中;
S4,把当前的包数据在数据缓存区的存储地址的包头ID(即上述的包类型ID)写入到对应的地址缓存区中;
S5,如果当前接收的包数据是该数据包的最后一份数据(由包结束标志决定),则包状态处理电路将对应包的状态置为“有效”标志;如果某个包完成了接收,包状态处理电路通知内部数据处理单元处理包数据;内部处理单元根据包的ID到地址缓冲区读取包在数据缓存区当中的最后一份数据的地址;
S6,得到数据包的最后一份数据的地址后,根据这个地址到数据缓存区中读取数据,对数据进行解析,因为读出的数据中包含有上一份数据的存储地址,所以再根据新得到的地址继续索引上一份数据,依次读取就该数据包的所有的包数据索引出来了;如果在包数据的读取过程中发现该数据包的起始位有效,则表明该包数据已经读取完毕。
在本发明实施例中,数据包的每份包数据是指一般接口中一个数据包的所有数据需要分成若干个周期进行传输,这里的一份包数据就是在一个周期传输的数据。请参考图3,包的数据流和包格式如图3所示,在图3中,Px包类型优先级最低,可以被Py,Pz打断;同时,Py优先级低,又可以被Pz打断;只有先传输完Pz,再传输Py,最后再传输Px。
在本发明实施例中,地址缓存区可以用于存储当前数据包的当前包数据在数据缓存区当中的地址,它是一般采用一个写端口,两个读端口的随机读取存储器(RAM),写端口用来写入当前包数据的存储地址;其中,一个读端口为数据处理单元所用;另外一个读端口为数据缓存区电路所用。数据缓存区可以用来存储当前的包数据、以及上一份数据在数据缓存区的地址信息、包的起始标志、包的结束标志。每个包的索引也就是通过数据缓存区当中的地址信息来实现。由于当前读出的数据中包含上一份数据在数据缓存区所在的地址,所以可通过这种方式将整个包数据以一个倒序的链表方式串联起来。其中,包数据索引结束是通过包的起始标志来判断的。包状态处理电路可以用来管理每种数据包的当前的状态,这个状态标志该数据包是否完成包数据的接收。完成一个完整包的接收需要把对应包的状态置为“有效”状态;数据处理单元完成一个对应数据包的处理需要包对应包的状态置为“无效”状态。
在本发明实施例中,步骤S104中的地址缓存区存储的地址信息是某种类型的数据包的最后一份数据在数据缓存区的地址。其中,地址缓存区可以以包类型ID进行寻址,每接收到一份包数据时,可以首先从地址缓存区读取该类型上一份数据在数据缓存区所在的地址,读取后把该地址信息跟数据一起写入到数据缓存区中。请参照图4,图4中描述的是接收方接收到包类型为Z的数据包时,首先从包地址缓存区读取Z包上一份数据在数据缓存区当中的地址addr_a,再把数据、包的起始标志和addr_a一起存入到数据缓冲区中;同时,还需要把当前的数据缓存区的地址addr_b写入到地址缓存区中,通过这个过程就完成了Z包数据的链接。
在本发明实施例中,数据缓存区中的每份包数据都包含有一个地址信息,该地址信息是该包数据的上一份数据在数据缓冲区的地址。当接收到某个包最后一份数据的时候,只需要把该包最后一份数据在数据缓冲区的地址信息保存到地址缓冲区中,内部处理模块就可以得到最后一份数据的地址,从而把该数据包的所有的包数据索引出来。
请参照图5,对某个包的索引方式如附图5所示,接收方完成了Z包的数据接收后就把state_symbol对应的包状态置为有效。在本发明实施例的一个优选实施方式中,数据处理模块得到Z包有效的信息后,可以读取地址缓存区(addr_buf)中包Z的地址信息addr_c,addr_c就是包Z在数据缓冲区(data_buf)中最后一份数据的地址;用地址addr_c读取包Z最后一份数据,读取最后一份数据后可以马上解析出倒数第二份数据的地址addr_b,再用addr_b读出倒数第三份数据来,依次索引下去,直到索引出的数据里面包含包的起始信息才完成一个包所有数据的索引。由于当前从数据缓存区读出的数据包含上一份数据的地址,因此内部缓存区读出的数据是倒序的。内部处理模块需要根据自身的特点或者系统的需要决定是否需要把包数据的顺序调换过来。例如,如果需要调换,那么从数据缓冲区读出的数据可以重新存储到一个小的缓冲器(BUFF)空间中,内部处理模块只需要从BUFF的最后一个地址空间开始倒序读取即可得到系统所需要的数据。
在本发明实施例中,各种包类型的数据均使用统一的空间进行顺序存储,每收到一份包数据就可以直接写入数据缓冲区中,同时地址加1。而如果采用传统的分区存储方法,则每种类型的包至少需要一个存储区,并且考虑到在某些情况下发送方可能一直发送一种数据包,所以,在为每个存储区开辟空间时,都需按照最大流量来进行开辟。在实际运用中,如果某个数据包由于优先级比较低,大多被断续传送到接收方,此时,接收方只需要根据上述链表存储的方法直接进行存储,而在读取的时候,只需要根据上述的方法就把断续的数据重新组装起来。如果某种类型的包由于某些原因需要丢弃处理,只需要把对应包的状态重新置位即可。
上述步骤S1-S6描述了从接收数据包到数据处理单元读取数据包的过程。在整个过程中,数据是倒序索引出来的,因此内部逻辑在应用的时候需要区分对待。例如,如果包数据内部每个周期的数据是独立的,则数据可以直接应用;如果包数据内部是相关联的,则数据处理单元可以根据需要加一组乒乓缓冲器,就可以把数据倒换回来。
需要说明的是,本发明实施例提供的上述方法完全可以采用流水线操作,接收方一旦接收到数据,可直接按照图2所示的步骤S1-S6的顺序进行操作,并且,不管是包类型乱序还是包内数据断续传输,如果按照步骤S1-S6进行操作,都可以对每个类型数据包的包数据进行高效的管理。即使在某些情况下,系统需要对数据包进行丢弃处理时,也只需要在包状态指示电路中把对应包的状态置为“无效”即可,这样包状态指示电路就不会再通知内部数据处理单元。
采用上述实施例提供的数据存储方法,利用链表的概念将存储端口接收到的某个类型包的当前包数据存储在一个统一的地址缓存空间,在接收完一个完整的数据包后,就可以通知系统的处理模块对存储的数据包进行读取,节省了RAM资源;并且在发生包类型乱序或者数据断续传输的情况下,仍能够保证包数据的正确接收,从而大大提高了通信系统中数据传输的正确率。
图6是根据本发明实施例的数据存储装置的结构示意图,该装置用以实现上述实施例提供的数据存储方法,该装置主要包括:接收模块10、存储模块20以及记录模块30。其中,接收模块10,用于接收发送方发送的当前数据包的当前包数据,其中,当前包数据携带有当前数据包的包类型标识ID;存储模块20,连接至接收模块10,用于根据包类型ID从地址缓存区中读取当前包数据的上一份包数据在数据缓存区中的第一存储地址,将第一存储地址、当前包数据作为新的包数据存储到数据缓存区;记录模块30,连接至存储模块20,用于记录新的包数据在数据缓存区中的第二存储地址,将第二存储地址添加到对应于包类型ID的地址缓存区。
图7是根据本发明优选实施例的数据存储装置的结构示意图,如图7所示,该装置还可以包括:判断模块40和更新模块50。其中,判断模块40,用于根据当前数据包的当前包数据中携带的包起始状态标识和/或包结束状态标志,确定当前数据包接收开始或接收完成。更新模块50,用于在判断模块40判断当前数据包接收完成后,将当前数据包的包状态更新为有效。
优选地,在实际应用中,接收模块10还可以用于接收系统发送的丢弃当前数据包的执行命令;更新模块50,还可以用于根据执行命令将当前数据包的包状态更新为无效。
在本发明实施例的一个优选实施方式中,如图7所示,该装置还可以包括:读取模块60,连接至记录模块30和存储模块20,用于在当前数据包接收完成之后,根据当前数据包的最后一份包数据中的存储地址,以从后往前的顺序依次从所述存储模块20中读取当前包数据的上一份包数据,直至读取到当前数据包的第一份报数据结束。
图8是根据本发明实施例一个优选实施方式的乱序数据包链表式存储装置示意图,如图8所示,该装置包括:包接收、解包模块81,用于在端口接收包数据,将包数据中的包类型,包起始标志,包结束标志解析出来;数据存储模块82,用于存储解包电路解析出来的包数据、缓存数据中包含的链表信息以及包起始信息,根据端口的最大流量采用统一的存储区进行存储空间的分配;地址存储模块83,用于保存每种类型包的最后一份包数据在数据缓存区的地址,其中,确定当前数据包接收结束时,地址缓存区中的地址即数据包在数据缓存区中的最后一份包数据的地址;包状态处理模块84,用于指示当前数据包是否接收完成的的标志,其中,当接收完某个数据包时,标志为“有效”指示,通知内部逻辑可以调用该包,如果内部逻辑完成某个包处理时,去除“无效”指示,如果由于某些原因或某个数据包需要丢弃处理,,在包状态电路中重新把对应包的状态置为“无效”指示;数据处理单元85,用于在数据包的包数据接收完成并存储完毕后,对数据存储区中的包数据进行读取。
需要说明的是,在接口硬件设计中,应用软件领域链表的概念来存储数据包,正如上述方法步骤中所描述的,可以将数据采用链表式管理作为基础。同时,接收方对数据包的存储不采用传统的分区存储方式,而是根据接口的最大流量采用统一存储的方式,从而大大节省了存储资源,不仅能够支持数据包的顺序传输,而且能够支持数包的乱序传输(包括数据包内的包数据断续传输)。
采用上述实施例提供的数据存储装置,可以实现上述实施例提供的数据存储方法,将存储端口接收到的某个类型包的当前包数据存储在一个统一的地址缓存空间,通过链表的方式将当前数据包的包数据的存储地址按照先后次序存储在数据缓区中,进而接收完一个完整的数据包,节省了RAM资源,并且在发生包类型乱序或者数据断续传输的情况下,仍能够保证包数据的正确接收。
从以上的描述中,可以看出,本发明实现了如下技术效果:通过采用一种链表式的存储方法对当前数据包的当前包数据进行存储,并且将所有数据包的包数据存储在一个存储空间内,其中,当前包数据中包含上一份包数据中的存储地址,方便了当前数据包接收完成后对当前数据包进行链表式读取,解决了传统存储方法不能够支持乱序包接收、采用大量存储分区数据包导致的存储资源浪费的问题,进而达到了支持乱序包的包内断续传输、节省存储资源的效果。
显然,本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,并且在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。