数据读写方法、装置以及环形队列与流程

文档序号:15828677发布日期:2018-11-03 00:11阅读:255来源:国知局

本发明涉及数据存储技术领域,尤其涉及一种数据读写方法、装置以及环形队列。

背景技术

队列就是一个能够实现“先进先出”(firstinfirstout,fifo)的存储结构。队列分为普通队列和环形队列。普通队列一般由数组构成,按照先进先出的处理方式进行数据的存取。内存上没有环形的结构,因此环形队列实上是数组的线性空间来实现。

环列队列在逻辑上是将数组元素q[0]与q[maxn-1]连接,形成一个存放队列的环形空间。为了方便读写,还要用数组下标来指明队列的读写位置。例如head/tail,其中head指向可以读的位置,tail指向可以写的位置。

虽然,环形队列提高了数据的存取效率,但是现有的环形队列只能支持数据的单输入单输出。当存在多个并发输出的场景时,需要开辟多个环形队列,内存消耗大,数据传输效率低下。



技术实现要素:

本发明提供一种数据读写方法、装置以及环形队列,以实现多个读线程可以同时从环形队列中读取数据,从而有效提高了数据的读写效率,降低内存的消耗。

第一方面,本发明实施例提供一种数据读写方法,包括:

从环形队列的队列头中获取写指针的偏移位置;

根据所述写指针的偏移位置确定读指针的偏移位置;

根据所述读指针的偏移位置,从所述环形队列中读取数据。

可选地,所述从环形队列的队列头中获取写指针的偏移位置,包括:

至少2个读线程从环形队列的队列头中获取写指针的偏移位置。

可选地,所述至少2个读线程属于一个进程;或者,

所述至少2个读线程分别属于一个进程;或者,

所述至少2个读线程分别由一个处理器运行;或者,

所述至少2个读线程由一个处理器运行。

可选地,所述根据所述写指针的偏移位置确定读指针的偏移位置,包括:

将所述写指针的偏移位置作为所述读指针的偏移位置。

可选地,所述根据所述读指针的偏移位置,从所述环形队列中读取数据,包括:

根据所述读指针的偏移位置,查找到所述环形队列中的一帧;

读取所述帧的帧头和帧数据。

可选地,所述从所述环形队列中读取数据之后,所述方法还包括:

判断所述环形队列的队列头中的写指针的偏移位置是否更新;

若为是,则根据所述写指针更新后的偏移位置,再次从所述环形队列中读取数据。

可选地,所述判断所述环形队列的队列头中的写指针的偏移位置是否更新,包括:

判断所述环形队列的队列头中的写指针对应的帧序号是否更新;

若为是,则确定所述写指针的偏移位置已更新。

可选地,所述判断所述环形队列的队列头中的写指针对应的帧序号是否更新,包括:

更新所述读指针对应的帧序号;

获取所述环形队列的队列头中所述写指针对应的帧序号;

判断更新后的读指针对应的帧序号是否小于所述写指针对应的帧序号;

若为是,确定所述环形队列的队列头总的写指针对应的帧序号已更新。

可选地,所述判断所述环形队列的队列头中的写指针的偏移位置是否更新,包括:

再次获取从所述环形队列的队列头中的写指针的偏移位置;

判断再次获取的写指针的偏移位置是否与上次获取的写指针的偏移位置相同;

若不同,确定所述环形队列的队列头中的写指针的偏移位置已更新。

第二方面,本发明实施例提供一种数据读写方法,包括:

当获取一帧待写入数据时,从环形队列的队列头中获取写指针的偏移位置;

根据所述写指针的偏移位置,将所述待写入数据写入所述环形队列中;

更新所述队列头中的写指针的偏移位置。

可选地,所述方法还包括:

根据所述写指针的偏移位置和所述待写入数据的大小,判断所述环形队列是否已满;

若为是,将所述写指针的偏移位置更改为所述环形队列的第一个存储空间所在位置。

可选地,所述根据所述写指针的偏移位置和所述待写入数据的大小,判断所述环形队列是否已满,包括:

判断所述写指针的偏移位置与所述待写入数据对应的帧的帧头和帧数据的大小之和是否大于或等于所述环形队列的大小;

若是,确定所述环形队列已满。

可选地,所述根据所述写指针的偏移位置,将所述待写入数据写入所述环形队列中,包括:

根据所述写指针的偏移位置,确定所述环形队列中的一帧存储空间;

将所述待写入数据的相关信息写入所述存储空间的帧头中,并将所述待写入数据写入所述存储空间的帧数据中。

可选地,所述根据所述写指针的偏移位置,将所述待写入数据写入所述环形队列中之后,所述方法还包括:

更新所述队列头中的写指针对应的帧序号。

第三方面,本发明实施例提供一种环形队列,包括:

队列头以及帧队列;

其中,所述队列头包括写指针的偏移位置;

所述帧队列中的一帧存储空间包括帧头和帧数据。

可选地,所述队列头还包括所述环形队列的大小。

可选地,所述队列头还包括所述写指针对应的帧序号。

可选地,所述帧头包括所述帧数据的长度、所述帧数据对应的帧序号以及偏移位置。

第四方面,本发明实施例提供一种数据读写装置,包括:

获取模块,用于从环形队列的队列头中获取写指针的偏移位置;

确定模块,用于根据所述写指针的偏移位置确定读指针的偏移位置;

读取模块,用于根据所述读指针的偏移位置,从所述环形队列中读取数据。

可选地,所述获取模块,具体用于:

通过至少2个读线程从环形队列的队列头中获取写指针的偏移位置。

可选地,所述至少2个读线程属于一个进程;或者,

所述至少2个读线程分别属于一个进程;或者,

所述至少2个读线程分别由一个处理器运行;或者,

所述至少2个读线程由一个处理器运行。

可选地,所述确定模块,具体用于:

将所述写指针的偏移位置作为所述读指针的偏移位置。

可选地,所述读取模块,具体用于:

根据所述读指针的偏移位置,查找到所述环形队列中的一帧;

读取所述帧的帧头和帧数据。

可选地,所述装置还包括:

判断模块,用于在从所述环形队列中读取数据之后,判断所述环形队列的队列头中的写指针的偏移位置是否更新;

若为是,则根据所述写指针更新后的偏移位置,再次从所述环形队列中读取数据。

可选地,所述判断所述环形队列的队列头中的写指针的偏移位置是否更新,包括:

判断所述环形队列的队列头中的写指针对应的帧序号是否更新;

若为是,则确定所述写指针的偏移位置已更新。

可选地,所述判断所述环形队列的队列头中的写指针对应的帧序号是否更新,包括:

更新所述读指针对应的帧序号;

获取所述环形队列的队列头中所述写指针对应的帧序号;

判断更新后的读指针对应的帧序号是否小于所述写指针对应的帧序号;

若为是,确定所述环形队列的队列头总的写指针对应的帧序号已更新。

可选地,所述判断所述环形队列的队列头中的写指针的偏移位置是否更新,包括:

再次获取从所述环形队列的队列头中的写指针的偏移位置;

判断再次获取的写指针的偏移位置是否与上次获取的写指针的偏移位置相同;

若不同,确定所述环形队列的队列头中的写指针的偏移位置已更新。

第五方面,本发明实施例提供一种数据读写装置,包括:

获取模块,用于在获取一帧待写入数据时,从环形队列的队列头中获取写指针的偏移位置;

写入模块,用于根据所述写指针的偏移位置,将所述待写入数据写入所述环形队列中;

更新模块,用于更新所述队列头中的写指针的偏移位置。

可选地,所述装置还包括:

判断模块,用于根据所述写指针的偏移位置和所述待写入数据的大小,判断所述环形队列是否已满;

若为是,将所述写指针的偏移位置更改为所述环形队列的第一个存储空间所在位置。

可选地,所述根据所述写指针的偏移位置和所述待写入数据的大小,判断所述环形队列是否已满,包括:

判断所述写指针的偏移位置与所述待写入数据对应的帧的帧头和帧数据的大小之和是否大于或等于所述环形队列的大小;

若是,确定所述环形队列已满。

可选地,所述写入模块,具体用于:

根据所述写指针的偏移位置,确定所述环形队列中的一帧存储空间;

将所述待写入数据的相关信息写入所述存储空间的帧头中,并将所述待写入数据写入所述存储空间的帧数据中。

可选地,所述更新模块,还用于在根据所述写指针的偏移位置,将所述待写入数据写入所述环形队列中之后,更新所述队列头中的写指针对应的帧序号。

第六方面,本发明实施例提供一种数据读写装置,包括:

存储器,用于存储读线程;

与所述存储器耦合的处理器,用于调用所述存储器中存储的读线程,以实现如第一方面中任一项所述的数据读写方法。

第七方面,本发明实施例提供一种数据读写装置,包括:

存储器,用于存储写线程;

与所述存储器耦合的处理器,用于调用所述存储器中存储的写线程,以实现如第二方面中任一项所述的数据读写方法。

第八方面,本发明实施例提供一种计算机可读存储介质,包括:指令,当其在计算机上运行时,使得计算机执行第一方面和/或第二方面中任一所述的方法。

本发明提供的数据读写方法、装置以及环形队列,通过从环形队列的队列头中获取写指针的偏移位置;根据所述写指针的偏移位置确定读指针的偏移位置;根据所述读指针的偏移位置,从所述环形队列中读取数据。从而使得多个读线程可以并行从环形队列中读取数据,从而有效提高了数据的读写效率,降低内存的消耗。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。

图1为本发明提供的环形队列的一应用场景的示意图;

图2为本发明实施例一提供的数据读写方法的流程图;

图3为环形队列的结构示意图;

图4为对环形队列中数据的读写的一种应用场景的示意图;

图5为本发明实施例二提供的数据读写方法的流程图;

图6为不同处理器之间的数据传输原理示意图;

图7为本发明实施例三提供的数据读写装置的结构示意图;

图8为本发明实施例四提供的数据读写装置的结构示意图;

图9为本发明实施例五提供的数据读写设备的结构示意图。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例例如能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。

下面以具体地实施例对本发明的技术方案进行详细说明。下面这几个具体的实施例可以相互结合,对于相同或相似的概念或过程可能在某些实施例不再赘述。

以下,对本申请中的部分用语进行解释说明,以便于本领域技术人员理解:

1)环形队列,是一个首尾相连的fifo的数据结构,采用数组的线性空间来实现,并能很快判断出队列状态是满或者空,从而实现数据的快速存取。环形队列原理:当数据到了队列尾部时,它将转回到0位置来处理。这个的转回是通过取模操作来执行的。因此,环列队列在逻辑上是将数组元素q[0]与q[maxn-1]连接,形成一个存放队列的环形空间。为了方便读写,还要用数组下标来指明队列的读写位置。例如head/tail,其中head指向可以读的位置,tail指向可以写的位置。

2)环形队列状态判断,是通过在类里面定义队列容量和队列长度来判断的。在判断队列是否为空时,通过判断队列长度是否为0,如果是则为空。在判断队列是否为满时,通过判断队列长度是否等于队列容量,如果是则为满。

3)共享内存,是进程间通信中最简单的方式之一。共享内存允许两个或更多进程访问同一块内存,就如同malloc()函数向不同进程返回了指向同一个物理内存区域的指针。若一个进程正在向共享内存区写数据,则在它做完这一步操作前,其他进程无法对该共享内存区执行读写操作。

本申请实施例提供的数据读写方法是针对环形队列,该环形队列可以由共同内存实现,在此情况下,该环形队列可以实现由一个进程的不同线程读写,也可以由多个进程读写,甚至可以由不同的处理器或不同芯片读写。

本申请实施例提供一种环形队列,该环形队列具备以下数据结构。通过以下数据结构,该环形队列可以实现同时对其进行读写操作,也可以实现多个读线程并行读该环形队列的数据。

图3为环形队列的结构示意图,图4为对环形队列中数据的读写的一种应用场景的示意图。如图3或图4所示,该环形队列包括:队列头以及帧队列;在队列头中包含有写指针的偏移位置,进一步地,该队列头还可以包括该环形队列的总大小,以及写指针所指向的帧序号。在帧队列的存储空间中存储有帧头、帧数据。其中,在帧头中可以存储有帧数据的长度、所述帧数据对应的帧序号以及偏移位置。其中,每个帧数据中可以用于存储一帧图像数据。帧头中所存储的帧数据的长度可以理解为帧数据的存储空间的大小,或者是存储在帧数据中的图像数据的数据大小。

其中,写指针的偏移位置是指写指针所指向的帧队列中某一帧的存储地址。如图3所示,pos1~pos8用于表示各帧的存储地址。相应的,写指针对应的帧序号即为该帧的帧序号。如图3所示,no1~no8即为各帧数据的帧序号,该帧序号可以用于表示帧数据的获取时间顺序,依次获取的每帧数据,如每帧图像数据,可以按照帧序号由小至大的顺序将依次获取的每帧图像数据写入帧队列中各帧序号对应的存储空间中。其中,帧序号对应的一帧存储空间可以用于存储一帧图像数据。当写线程数据写入最后一帧,如图3中的no8帧中时,下次再写入数据时,则从no1帧开始写入。如图3所示,len可以用于表示每帧存储的数据的大小。如,每帧存储的图像数据的数据长度或数据大小等。如图3所示,环形队列的队列头中存储有环形队列的总容量值(size),写指针偏移值(write_pos),写数据序号(write_no)。

具体地,写线程在将数据写入帧队列后,可以更新队列头中的写指针的偏移位置和写指针对应的帧序号。读线程可以从队列头中获取写指针的偏移位置,进而获知数据存储地址。这种方式节省了写线程与读线程的通信成本,同时,也可以支持多个读线程并行读取数据,并且由于读线程通过队列头中获取的写指针的偏移地址,是已经写入的数据的存储地址,避免了写线程与读线程操作同一个存储空间,因此,写线程所操作的帧队列中的存储空间与读线程所操作的帧队列中的存储空间隔离,进而实现了写线程和读线程可以同时对一个环形队列进行操作。

具体地,可以从环形队列的队列头中获取到写指针的偏移位置,然后根据该写指针的偏移位置确定读指针的偏移位置。当获知读指针的偏移位置后,即可从该环形队列中读取出数据。采用上述的环形队列结构,可以支持2个及以上的读线程并行从该环形队列中读取出数据。具体实现方式可以参见下述实施例。

在此,本申请实施例提供了一种应用该环形队列的系统。系统也可以理解为应用场景。其中,该系统用于传输并处理图像采集装置所采集的图像数据。例如,该系统可以被配置于无人飞行器中。

图1为本发明提供的环形队列的一应用场景的示意图,如图1所示,该应用场景可以适用于无人飞行器(unmannedaerialvehicle,uav)中。

其中线程1可以作为图像采集线程,其可以由图像采集装置中的处理器执行,线程1可以将采集到的图像数据,如yuv420图像数据,写入环形队列1,即相对于环形队列1,线程1为写线程。环形队列1基于上述数据结构,该环形队列1支持线程2~线程5对其进行并行读取,并支持线程1对环形队列1进行写操作时,线程2~线程5中的一个或多个线程对环形队列1进行读操作。即相对于环形队列1,线程2~线程5为读线程。其中,线程2用于hdmi显示,线程3用于对读取的图像数据进行第一类型的编码,如h264/h265编码。线程4用于对读取的数据进行第二类型的编码,如jpeg编码,对图像数据进行jpeg编码后,可以将编码后的图像数据进行本地存储;例如,存储至飞行器中的sd卡(securedigitalmemorycard,安全数位卡)或tf卡

(tranflash,移动存储卡)中。线程5用于对图像数据进行处理,如进行图像缩小(如将图像缩小至vga大小),进行处理后的图像数据可以进一步地进行视觉处理等,在此不予限定。

进一步地,线程3可以将编码后的图像数据写入环形队列2,即相对于环形队列2,线程3为写线程。环形队列2基于上述数据结构,环形队列2支持线程6~线程7对其进行并行读取,并支持线程3对环形队列2进行写操作时,线程6和/或线程7对环形队列2进行读操作。其中,线程6用于录像,即从第二环形队列中取出多帧图像数据进行mp4或mov格式的打包,以得到视频数据,可以将该视频数据进一步地存储在存储器中,即实现录像。线程7用于传输图像数据,将该图像数据传输至与飞行器连接的终端上进行实时显示或在终端中存储。

图1中采用了单输入多输出环形队列,在多个输出场景时可以降低内存消耗。码流视频图像大数据采用这种方式传输可以提升处理效率,降低传输的延时,并且各个读数据流程各自独立,互不干扰。比如图传卡顿时并不影响录像的过程,比如消耗cpu特别大的视觉处理和h264/h265编码根本不影响hdmi超低延时的显示。采用本发明提供的内存管理方法,实现了数据的单输入多输出,从而有效提高了数据的传输效率,降低内存损耗。

基于所介绍的环形队列的数据结构以及上述应用场景。下面将结合附图,介绍针对上述环形队列的读写方式。

首先介绍本申请实施例提供的读取该环形队列中的数据的方式。

图2为本发明实施例一提供的数据读写方法的流程图,如图2所示,本实施例中的方法可以包括:

s101、从环形队列的队列头中获取写指针的偏移位置。

示例性地,读线程在被处理器执行时,可以实现从环形队列的队列头中获取写指针的偏移位置。

具体地,读线程可以监测队列头中写指针的偏移位置是否变化,若变化,则表明有新数据写入环形队列,即触发获取写指针的偏移位置。或者,读线程在需要读取数据的情况下,从环形队列的队列头中获取写指针的偏移位置。

具体地,读线程可以周期性地获取写指针的偏移位置,通过比对写指针的偏移位置是否相同,来判断是否有新数据写入。或者,读线程在触发条件下,如接收到处理器中其他线程的调用指令时,获取写指针的偏移位置。

s102、根据所述写指针的偏移位置确定读指针的偏移位置。

本实施例中,可以通过获取队列头中的写指针的偏移位置;根据所述写指针偏移值,即写指针的偏移位置,确定读指针所指示的位置,即读指针的偏移位置。具体地,可以将所述写指针的偏移位置作为所述读指针的偏移位置。假设当前的写指针偏移值为pos5,此时,所有读线程均可以根据pos5这个偏移值,确定当前写入的数据在环形队列中的位置,因此可以将读指针指向pos5这个偏移值所指示的位置。当确定读指针指示的位置之后,读线程即可从读指针指示的位置处读取数据。需要说明的是,读线程可以是不同进程,也可以是来自不同处理器、不同芯片的线程;且各个读线程之间的读取动作相互独立,互不影响。

s103、根据所述读指针的偏移位置,从所述环形队列中读取数据。

本实施例中,可以根据所述读指针的偏移位置,查找到所述环形队列中的一帧;读取所述帧的帧头和帧数据。

具体地,读线程可以读取该帧的帧头,获知该帧数据的帧序号以及该帧数据的数据大小。进而,可以根据数据大小确定所读取的数据的终点。

可选地,所述从所述环形队列中读取数据之后,所述方法还包括:

判断所述环形队列的队列头中的写指针的偏移位置是否更新;若为是,则根据所述写指针更新后的偏移位置,再次从所述环形队列中读取数据。

本实施例中,可以判断所述环形队列的队列头中的写指针对应的帧序号是否更新,若为是,则确定所述写指针的偏移位置已更新。

进一步地,可以通过更新所述读指针对应的帧序号;获取所述环形队列的队列头中所述写指针对应的帧序号;判断更新后的读指针对应的帧序号是否小于所述写指针对应的帧序号;若为是,确定所述环形队列的队列头中的写指针对应的帧序号已更新。也可以再次获取从所述环形队列的队列头中的写指针的偏移位置;判断再次获取的写指针的偏移位置是否与上次获取的写指针的偏移位置相同;若不同,确定所述环形队列的队列头中的写指针的偏移位置已更新。

具体地,当读线程从读指针指示的位置处读取出一帧数据之后,该读线程中记录的读取数据帧次数的计数值会被更新。该计数值也可以理解为是读指针的帧序号。

具体地,可以在读取数据帧之后,令所述计数值自增1。在获取环形队列的读指针位置之前,首先获取当前队列头中的写数据序号,即写指针的指针号;判断所述计数值是否小于所述写数据序号,若所述计数值大于或等于所述写数据序号,则表明写线程上一次写入的数据已被读取完,则重新获取队列头中的写数据序号。若所述计数值小于所述写数据序号,则获取环形队列的读指针,继续进行数据读取。其中,所述写数据序号用于统计环形队列中写入数据帧的次数;每当写线程在环形队列中写入数据帧之后,写数据序号会自增1。

本实施例中,通过计数值来统计读线程对数据帧的读取次数,原则上,任何一个读线程的读取次数均应该小于写数据序号。通过在获取读指针之前,首先判断计数值和写数据序号的大小,可以避免在环形队列进行写数据操作时,读线程对正在写入的数据帧的读取操作。

本实施例,通过从环形队列的队列头中获取写指针的偏移位置;根据所述写指针的偏移位置确定读指针的偏移位置;根据所述读指针的偏移位置,从所述环形队列中读取数据。从而使得多个读线程可以同时从环形队列中读取数据,从而有效提高了数据的读写效率,降低内存的消耗。

下面介绍本申请实施例提供的将数据写入该环形队列的方式。

图5为本发明实施例二提供的数据读写方法的流程图,如图5所示,本实施例中的方法可以包括:

s201、当获取一帧待写入数据时,从环形队列的队列头中获取写指针的偏移位置。

本实施例中,从环形队列的队列头中获取写指针偏移值,所述写指针偏移值指示了环形队列当前可供存储的存储区域。本实施例中,数据帧的写入顺序是从队列头侧开始顺次按照环形队列的存储区域写入的,因此,数据帧的帧号是顺次累积的,例如帧号no的值依次为:1、2、3….。

s202、根据所述写指针的偏移位置,将所述待写入数据写入所述环形队列中。

本实施例中,可以根据所述写指针的偏移位置,确定所述环形队列中的一帧存储空间;将所述待写入数据的相关信息写入所述存储空间的帧头中,并将所述待写入数据写入所述存储空间的帧数据中。当确定写指针偏移值时,即可确定当前待写入数据帧在环形队列中的写入位置。其中,待写入数据的相关信息包括:待写入数据帧的总长度,所述待写入数据帧的总长度是指:待写入数据帧的帧头长度与帧数据长度之和;所述帧头长度为:存储帧号的空间长度、存储帧长度的空间长度,以及存储偏移值的空间长度之和。

可选地,所述方法还包括:

根据所述写指针的偏移位置和所述待写入数据的大小,判断所述环形队列是否已满;

若为是,将所述写指针的偏移位置更改为所述环形队列的第一个存储空间所在位置。

本实施例中,可以通过判断所述写指针的偏移位置与所述待写入数据对应的帧的帧头和帧数据的大小之和是否大于或等于所述环形队列的大小;若是,确定所述环形队列已满。

具体地,在写入数据帧之前,首先判断写指针偏移值与待写入数据帧的总长度之和是否小于环形队列的总容量值。据此可知,环形队列的存储状态,避免写入的数据帧溢出的情况。当写指针偏移值与待写入数据帧的总长度之和大于或等于环形队列的总容量值,则说明环形队列为满的状态,若写入数据帧,则会造成数据帧溢出。当写指针偏移值与待写入数据帧的总长度之和小于环形队列的总容量值,则说明环形队列未满,可以正常写入数据帧。

本实施例中,在写指针偏移值与待写入数据帧的总长度之和大于或等于环形队列的总容量值时,将所述写指针偏移值变更为队列头长度,此时,环形队列中存储的数据帧被清空,待写入的数据帧从队列头侧的存储区域开始顺次写入。在写指针偏移值与待写入数据帧的总长度之和小于环形队列的总容量值时,根据所述写指针偏移值所指示的写入位置,将所述待写入数据帧写入环形队列中的写入位置。

s203、更新所述队列头中的写指针的偏移位置。

本实施例中,在写指针偏移值与待写入数据帧的总长度之和大于或等于环形队列的总容量值时,将所述写指针偏移值变更为队列头长度,此时,环形队列中存储的数据帧被清空,待写入的数据帧从队列头侧的存储区域开始顺次写入。在写指针偏移值与待写入数据帧的总长度之和小于环形队列的总容量值时,根据所述写指针偏移值所指示的写入位置,将所述待写入数据帧写入环形队列中的写入位置。

本实施例中,当完成数据帧的写入操作之后,需要更新队列头中的写指针偏移值。可选地,可以将队列头中的写指针偏移值变更为:上一次写入数据时的写指针偏移值与当前待写入数据帧的总长度之和。更新队列头中的写数据序号。具体地,可以在数据帧写入之后,令所述写数据序号,即写指针的帧序号自增1。

本实施例,通过在获取一帧待写入数据时,从环形队列的队列头中获取写指针的偏移位置;根据所述写指针的偏移位置,将所述待写入数据写入所述环形队列中;更新所述队列头中的写指针的偏移位置。。从而使得多个读线程可以同时从环形队列中读取数据,从而有效提高了数据的读写效率,降低内存的消耗。。

图6为不同处理器之间的数据传输原理示意图,如图6所示,在双倍速率同步动态随机存储器(doubledatarate,ddr)的起始物理地址phyaddr大小为size的一块连续区域作为共享内存,该共享区域构成一个环形队列。在第一处理器10中通过映射得到对应的虚拟地址viraddr1,则viraddr1开始大小为size的区域可以理解为上述环形队列,写线程可以操作该环形队列写入数据。在第二处理器20中通过映射得到不同的虚拟地址viraddr2,则viraddr2开始大小为size的区域可以理解为上述环形队列,读线程可以操作该环形队列读取数据。第一处理器10和第二处理器20之间就可以通过这个共享内存进行数据的传输,处理器不需要相互进行消息通知,即可完成数据的写入和读取。类似的,不同的进程、甚至不同的芯片,只要使用同一个物理ddr,就可以采用图6的技术方案进行高效率的数据传输。环形队列基于共享内存创建,因此,不仅可以实现多个线程的数据传输,也能实现多个进程、多个cpu处理器、多个芯片的大数据传输。

图6中的第一处理器10中通过映射得到对应的虚拟地址viraddr1可以执行上述图4所示的技术方案,图6中的第二处理器20通过映射得到对应的虚拟地址viraddr2可以执行上述图2所示的技术方案,具体实现过程和技术原理请参考图2、图5中的相关描述,此处不再赘述。

图7为本发明实施例三提供的数据读写装置的结构示意图,如图7所示,本实施例中的装置可以包括:

获取模块30,用于从环形队列的队列头中获取写指针的偏移位置;

确定模块40,用于根据所述写指针的偏移位置确定读指针的偏移位置;

读取模块50,用于根据所述读指针的偏移位置,从所述环形队列中读取数据。

可选地,所述获取模块30,具体用于:

通过至少2个读线程从环形队列的队列头中获取写指针的偏移位置。

可选地,所述至少2个读线程属于一个进程;或者,

所述至少2个读线程分别属于一个进程;或者,

所述至少2个读线程分别由一个处理器运行;或者,

所述至少2个读线程由一个处理器运行。

可选地,所述确定模块40,具体用于:

将所述写指针的偏移位置作为所述读指针的偏移位置。

可选地,所述读取模块50,具体用于:

根据所述读指针的偏移位置,查找到所述环形队列中的一帧;

读取所述帧的帧头和帧数据。

可选地,所述装置还包括:

判断模块60,用于在从所述环形队列中读取数据之后,判断所述环形队列的队列头中的写指针的偏移位置是否更新;

若为是,则根据所述写指针更新后的偏移位置,再次从所述环形队列中读取数据。

可选地,所述判断所述环形队列的队列头中的写指针的偏移位置是否更新,包括:

判断所述环形队列的队列头中的写指针对应的帧序号是否更新;

若为是,则确定所述写指针的偏移位置已更新。

可选地,所述判断所述环形队列的队列头中的写指针对应的帧序号是否更新,包括:

更新所述读指针对应的帧序号;

获取所述环形队列的队列头中所述写指针对应的帧序号;

判断更新后的读指针对应的帧序号是否小于所述写指针对应的帧序号;

若为是,确定所述环形队列的队列头总的写指针对应的帧序号已更新。

可选地,所述判断所述环形队列的队列头中的写指针的偏移位置是否更新,包括:

再次获取从所述环形队列的队列头中的写指针的偏移位置;

判断再次获取的写指针的偏移位置是否与上次获取的写指针的偏移位置相同;

若不同,确定所述环形队列的队列头中的写指针的偏移位置已更新。

本实施例可以执行上述图2所示的方法中的技术方案,其实现过程和技术效果与上述方法类似,此处不再赘述。

图8为本发明实施例四提供的数据读写装置的结构示意图,如图8所示,本实施例中的装置可以包括:

获取模块70,用于在获取一帧待写入数据时,从环形队列的队列头中获取写指针的偏移位置;

写入模块80,用于根据所述写指针的偏移位置,将所述待写入数据写入所述环形队列中;

更新模块90,用于更新所述队列头中的写指针的偏移位置。

可选地,所述装置还包括:

判断模块100,用于根据所述写指针的偏移位置和所述待写入数据的大小,判断所述环形队列是否已满;

若为是,将所述写指针的偏移位置更改为所述环形队列的第一个存储空间所在位置。

可选地,所述根据所述写指针的偏移位置和所述待写入数据的大小,判断所述环形队列是否已满,包括:

判断所述写指针的偏移位置与所述待写入数据对应的帧的帧头和帧数据的大小之和是否大于或等于所述环形队列的大小;

若是,确定所述环形队列已满。

可选地,所述写入模块80,具体用于:

根据所述写指针的偏移位置,确定所述环形队列中的一帧存储空间;

将所述待写入数据的相关信息写入所述存储空间的帧头中,并将所述待写入数据写入所述存储空间的帧数据中。

可选地,所述更新模块90,还用于在根据所述写指针的偏移位置,将所述待写入数据写入所述环形队列中之后,更新所述队列头中的写指针对应的帧序号。

本实施例可以执行上述图5所示的方法中的技术方案,其实现过程和技术效果与上述方法类似,此处不再赘述。

本发明实施例还提供一种环形队列,包括:

队列头以及帧队列;

其中,所述队列头包括写指针的偏移位置;

所述帧队列中的一帧存储空间包括帧头和帧数据。

可选地,所述队列头还包括所述环形队列的大小。

可选地,所述队列头还包括所述写指针对应的帧序号。

可选地,所述帧头包括所述帧数据的长度、所述帧数据对应的帧序号以及偏移位置。所述环形队列用于执行图2、图5中所述技术方案。

本实施例可以执行上述图2、图5所示的方法中的技术方案,其实现过程和技术效果与上述方法类似,此处不再赘述。

本发明实施例还提供一种应用于环形缓冲区的数据结构,包括:

队列头和帧队列;

其中,所述队列头包括所述环形缓冲区的大小信息,写指针偏移位置以及写指针对应的帧序号;

所述帧队列中的每一帧包括帧头和帧数据;

所述帧头包括所述帧数据的长度,所述帧在所述帧队列中的偏移位置以及所述帧的序号。

本实施例可以执行上述图2、图5所示的方法中的技术方案,其实现过程和技术效果与上述方法类似,此处不再赘述。

图9为本发明实施例五提供的数据读写设备的结构示意图,如图9所示,本实施例中的数据读写设备200包括:

处理器210以及存储器220;其中:

存储器220,用于存储计算机程序(如实现上述数据读写的应用程序、线程程序,如读线程或写线程,功能模块等)、计算机指令、数据等,上述的计算机程序、计算机指令、数据等可以分区存储在一个或多个存储器220中。并且上述的计算机程序、计算机指令、数据等可以被处理器210调用。

其中,存储器220可以包括易失性存储器(英文:volatilememory),例如随机存取存储器(英文:random-accessmemory,缩写:ram),如静态随机存取存储器(英文:staticrandom-accessmemory,缩写:sram),双倍数据率同步动态随机存取存储器(英文:doubledataratesynchronousdynamicrandomaccessmemory,缩写:ddrsdram)等;存储器也可以包括非易失性存储器(英文:non-volatilememory),例如快闪存储器(英文:flashmemory),硬盘(英文:harddiskdrive,缩写:hdd)或固态硬盘(英文:solid-statedrive,缩写:ssd);存储器220还可以包括上述种类的存储器的组合。

存储器220还可以用于存储上述环形队列的数据结构,以实现上述环形队列。当然,该环形队列还可以存储在其他存储空间中,在此不予限定。

处理器210,用于执行存储器存储的线程程序或计算机程序或指令,以实现上述实施例涉及的方法中的各个步骤。具体可以参见前面方法实施例中的相关描述。

其中,处理器210可以是中央处理器(英文:centralprocessingunit,缩写:cpu),网络处理器(英文:networkprocessor,缩写:np),数据处理器,图像处理器,任务处理器等专用处理器中的一种或组合。

其中,处理器210还可以进一步包括硬件芯片。上述硬件芯片可以是专用集成电路(英文:application-specificintegratedcircuit,缩写:asic),可编程逻辑器件(英文:programmablelogicdevice,缩写:pld)或其组合。上述pld可以是复杂可编程逻辑器件(英文:complexprogrammablelogicdevice,缩写:cpld),现场可编程逻辑门阵列(英文:field-programmablegatearray,缩写:fpga),通用阵列逻辑(英文:genericarraylogic,缩写:gal)或其任意组合。当然,处理器还可以包括单片机等硬件装置。

可选地,存储器220既可以是独立的,也可以跟处理器210集成在一起。

当所述存储器220是独立于处理器210之外的器件时,所述内存管理设备200还可以包括:

总线230,用于连接所述存储器220和处理器210。

此外,本申请实施例还提供一种计算机可读存储介质,计算机可读存储介质中存储有计算机执行指令,当至少一个处理器执行该计算机执行指令时,用实现上述各种可能的方法。

其中,计算机可读介质包括计算机存储介质和通信介质,其中通信介质包括便于从一个地方向另一个地方传送计算机程序的任何介质。存储介质可以是通用或专用计算机能够存取的任何可用介质。一种示例性的存储介质耦合至处理器,从而使处理器能够从该存储介质读取信息,且可向该存储介质写入信息。当然,存储介质也可以是处理器的组成部分。处理器和存储介质可以位于asic中。另外,该asic可以位于用户设备中。当然,处理器和存储介质也可以作为分立组件存在于通信设备中。

本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:rom、ram、磁碟或者光盘等各种可以存储程序代码的介质。

最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1