发明内容
本发明解决的技术问题是如何提高系统的数据处理效率。
为解决上述技术问题,本发明实施例提供一种用于SOCFPGA的数据循环缓冲方法,包括:按照数据写入顺序在n个缓冲中顺序写入数据,所述n为正整数并根据缓冲深度确定;根据最新写入位置和最后读取位置确定有效缓冲,所述有效缓冲为所述n个缓冲中存储有未被读取数据的缓冲;在读取数据时,自所述最后读取位置开始按照数据读取顺序依次读取所述有效缓冲中存储的数据,直至所述最新写入位置。
可选的,所述数据写入顺序与所述数据读取顺序的方向相同。
可选的,当第n个缓冲被写入数据后,从第1个缓冲开始继续写入数据。
可选的,当第n个缓冲中存储的数据被读取后,从第1个缓冲开始继续读取数据。
可选的,所述根据最新写入位置和最后读取位置确定有效缓冲包括:当所述最新写入位置等于所述最后读取位置,所述有效缓冲的数量为零。
可选的,所述根据最新写入位置和最后读取位置确定有效缓冲包括:以所述数据写入顺序为正方向,当所述最新写入位置大于所述最后读取位置时,所述有效缓冲为所述最后读取位置至所述最新写入位置之间的缓冲。
可选的,所述根据最新写入位置和最后读取位置确定有效缓冲包括:以所述数据写入顺序为正方向,当所述最新写入位置小于所述最后读取位置时,所述有效缓冲为所述最后读取位置至第n个缓冲,以及第1个缓冲至最新写入位置之间的缓冲。
可选的,所述n个缓冲连续的设置于同一缓冲区中;或者,所述n个缓冲分散设置于多个缓冲区,并通过组织结构顺序链接。
本发明实施例还提供一种用于SOCFPGA的数据循环缓冲装置,包括:写模块,用于按照数据写入顺序在n个缓冲中顺序写入数据,所述n为正整数并根据缓冲深度确定;确定模块,用于根据最新写入位置和最后读取位置确定有效缓冲,所述有效缓冲为所述n个缓冲中存储有未被读取数据的缓冲;读模块,在读取数据时,自所述最后读取位置开始按照数据读取顺序依次读取所述有效缓冲中存储的数据,直至所述最新写入位置。
本发明实施例还提供一种存储介质,其上存储有计算机指令,所述计算机指令运行时执行上述方法的步骤。
本发明实施例还提供一种终端,包括存储器和处理器,所述存储器上存储有能够在所述处理器上运行的计算机指令,所述处理器运行所述计算机指令时执行上述方法的步骤。
与现有技术相比,本发明实施例的技术方案具有以下有益效果:
本发明实施例的技术方案提供一种用于SOCFPGA的数据循环缓冲方法,包括:按照数据写入顺序在n个缓冲中顺序写入数据,所述n为正整数并根据缓冲深度确定;根据最新写入位置和最后读取位置确定有效缓冲,所述有效缓冲为所述n个缓冲中存储有未被读取数据的缓冲;在读取数据时,自所述最后读取位置开始按照数据读取顺序依次读取所述有效缓冲中存储的数据,直至所述最新写入位置。较之现有用于SOCFPGA的数据缓冲方案,本发明实施例所述方案能够根据缓冲深度设立n个缓冲并在其中循环写入数据,通过记录最后读取位置和最新写入位置,使得数据读取端(如ARM的CPU)能够根据自身的忙闲情况自行调节读取进度,由于缓冲区的数量足够多(即n个),有效避免出现缓冲的数据还未被读取处理就需要写入新数据的情形。本领域技术人员理解,采用本发明实施例所述循环缓冲方法能够使得SOCFPGA的系统在采集和转发大数据量的数据时不会产生数据丢失的问题,尤其对于基于低配置可编程器件(即低配置SOCFPGA,例如低配置ZYNQ)的系统,能够在极大地节省系统开销的基础上,保证数据完整性,极大地优化系统的数据处理效率。
进一步,所述数据写入顺序与所述数据读取顺序的方向相同,以保证数据完整性,确保最早写入的数据能够被尽快读取。
具体实施方式
本领域技术人员理解,如背景技术所言,现有SOCFPGA系统的的数据缓冲逻辑仍存在局限,导致系统的数据处理效率受到极大影响。
发明人经过分析发现,上述问题是由于现有SOCFPGA系统一般采用中断加双缓冲的方式来进行数据缓冲,以解决增强型精简指令集计算机(Advanced RISC Machines,简称ARM)的现场可编程逻辑门阵列(Field Programmable Gate Array,简称FPGA)之间的通信速度不匹配的问题。
但是,由于只有两个缓冲区,当数据量大时,ARM的中央处理器(CentralProcessing Unit,简称CPU)繁忙,FPGA和ARM处理数据的时间不规律(如由于CPU的调度关系,以及FPGA在操作内存而ARM受到内存时序上的制约,读取数据的速度也会受到影响等),极有可能出现缓冲的数据还没处理完就要写入新数据的情形,造成数据丢失,影响数据完整性。
而这一现象在基于低配置可编程器件(即低配置SOCFPGA,例如低配置ZYNQ)的系统上尤其明显,因为低配置可编程器件的FPGA和ARM的数据处理速度的差异更为明显,也就导致基于低配置可编程器件的系统的数据处理效率大打折扣。
为了解决上述技术问题,本发明实施例的技术方案提供一种用于SOCFPGA的数据循环缓冲方法,包括:按照数据写入顺序在n个缓冲中顺序写入数据,所述n为正整数并根据缓冲深度确定;根据最新写入位置和最后读取位置确定有效缓冲,所述有效缓冲为所述n个缓冲中存储有未被读取数据的缓冲;在读取数据时,自所述最后读取位置开始按照数据读取顺序依次读取所述有效缓冲中存储的数据,直至所述最新写入位置。
本领域技术人员理解,本发明实施例所述方案能够根据缓冲深度设立n个缓冲并在其中循环写入数据,通过记录最后读取位置和最新写入位置,使得数据读取端(如ARM的CPU)能够根据自身的忙闲情况自行调节读取进度,由于缓冲区的数量足够多(即n个),有效避免出现缓冲的数据还未被读取处理就需要写入新数据的情形。
进一步地,采用本发明实施例所述循环缓冲方法能够使得系统采集和转发大数据量的数据时不会产生数据丢失的问题,尤其对于基于低配置可编程器件(例如低配置ZYNQ)的系统,能够在极大的节省系统开销的基础上,保证数据完整性,极大地优化系统的数据处理效率。
为使本发明的上述目的、特征和有益效果能够更为明显易懂,下面结合附图对本发明的具体实施例做详细的说明。
图1是本发明第一实施例的一种用于SOCFPGA的数据循环缓冲方法的流程图。其中,本实施例可以应用于基于可编程器件的SOCFPGA系统,包括基于低配置可编程器件(如低配置ZYNQ)的系统,也可以应用于其他数据写入模块和数据读取模块的数据处理速度存在差异的系统;所述SOCFPGA是指带SOC的FPGA,亦即集成有SOC的FPGA。
具体地,在本实施例中,所述用于SOCFPGA的数据循环缓冲方法可以包括如下步骤:
步骤S101,按照数据写入顺序在n个缓冲中顺序写入数据,所述n为正整数并根据缓冲深度确定。
步骤S102,根据最新写入位置和最后读取位置确定有效缓冲,所述有效缓冲为所述n个缓冲中存储有未被读取数据的缓冲。
步骤S103,在读取数据时,自所述最后读取位置开始按照数据读取顺序依次读取所述有效缓冲中存储的数据,直至所述最新写入位置。
更为具体地,所述n个缓冲(也可称为缓存,buffer)可以是在一块内存块上分割获得的。
作为一个非限制性实施例,可以根据系统处理的时间抖动(jitter)来确定某一时间需要进行数据处理的缓冲时间,进而根据所述缓冲时间反推出合适的缓冲深度,进而确定所述n的具体数值。例如,在所述ARM的中央处理器(Central Processing Unit,简称CPU)繁忙时需要多个毫秒(即多个缓冲)才能将数据读走,则所述缓冲的数量n至少要大于2。
进一步地,所述缓冲深度还与所述ARM的硬件性能相关。
进一步地,所述缓冲深度还与其他模块的数据处理能力相关,所述其他模块可以是所述系统中除用于处理所述n个缓冲中存储的数据的模块之外需要消耗CPU资源的模块(或事件),以使得执行本实施例所述方案的数据读取模块(如ARM)能够控制何时读取所述n个缓冲中的数据,何时应该让出CPU资源给其他模块,以使其他模块有时间处理各自的数据。本领域技术人员理解,基于本实施例所述循环缓冲的方式,能够把数据的瞬间处理速度转换成平均效率,而不是单纯降低数据量或提升ARM的CPU的主频来解决CPU瞬间繁忙导致缓冲的数据丢失的问题,有利于提升数据完整性。
进一步地,所述n可以为大于2的正整数。优选地,所述n可以为3或4,以在所述CPU繁忙时能够实现自动缓冲的功能。
本领域技术人员理解,通过设立所述n个缓冲,无需动态分配内存即可完成队列的功能。
进一步地,所述数据写入顺序与所述数据读取顺序的方向可以相同,以保证数据完整性,确保最早写入的数据能够被尽快读取。
作为一个非限制性实施例,所述数据写入顺序可以是按照从第1个缓冲至第n个缓冲的顺序。进一步地,当第n个缓冲被写入数据后,可以从第1个缓冲开始继续写入数据。
相应的,所述数据读取顺序也可以是按照从第1个缓冲至第n个缓冲的顺序。进一步地,当所述第n个缓冲中存储的数据被读取后,可以从第1个缓冲开始继续读取数据。
本领域技术人员可以根据实际需要对所述数据写入顺序与数据读取顺序进行调整,在此不予赘述。
进一步地,写模块(如FPGA)在某一缓冲中写入数据后,可以告知读模块(如ARM)最新写入位置,所述读模块可以记录自身的最后读取位置,以顺利读取有效缓冲中存储的数据。其中,所述有效缓冲可以根据所述最新写入位置和最后读取位置确定。
在一个典型的应用场景中,在初始阶段或者所述CPU空闲时,所述最新写入位置可能等于所述最后读取位置,此时,所述有效缓冲的数量为零,亦即所述写模块写入的数据可以立即被所述读模块读取。
进一步地,为了保证数据的完整性,在本应用场景中,所述写模块仍可以按照所述数据写入顺序依次在所述n个缓冲中写入数据,所述读模块也按照所述数据读取顺序依次从所述n个缓冲中读取数据,但此时所述n个缓冲中只有一个缓冲中存储有未读数据,且存储的未读数据可以立即被读取。
进一步地,随着所述CPU的忙闲变化,还可能出现最新写入位置小于最后读取位置,或者最新写入位置大于最后读取位置的情形(以所述数据写入顺序为正方向),此时,所述有效缓冲不为空。
具体地,所述写模块可以始终按照其数据写入顺序向所述n个缓冲中写入数据,当所述数据写入位置移动至第n个缓冲时,可循环至第1个缓冲继续写入数据。在此期间,若所述CPU正好处于繁忙阶段,所述读模块可能没有太多时间处理所述n个缓冲中写入的数据,则所述最后读取位置可以维持不变。进一步地,当所述CPU空闲时,所述读模块可以快速消化掉所述有效缓冲中存储的数据,直至所述最后读取位置移动到与所述最新写入位置相一致,从而避免数据持续积压。
本领域技术人员理解,本实施例所采用的循环缓冲的方式能够提供非常弹性的系统工作模式。例如,当所述CPU繁忙时,所述数据写入位置可以从第1个缓冲向后移动至第n个缓冲再循环回第1个缓冲直到找到空闲位置,在此过程中,由于所述读模块没有时间处理数据,所以所述最后读取位置不动;当所述CPU空闲时,所述读模块可以读取并处理所述有效缓冲中存储的数据,此时,所述最新写入位置移动至空闲缓冲并写入数据,所述最后读取位置快速移动到和最新写入位置相一致,从而快速处理掉所有缓存的数据。其中,所述空闲位置可以指尚未被写入数据的空闲缓冲。
基于此原理,能够在所述CPU空闲时批量处理所有的缓冲中存储的数据,在所述CPU繁忙时又有足够多的缓冲提供给写模块缓冲数据,从而有效保证数据的完整性。
参考图2至图5,可以设立8个缓冲(即n=8),其中,每一个缓冲按照数据写入顺序(即数据读取顺序)依次编号为0至7号缓冲。所述FPGA用于按照所述数据写入顺序依次在0至7号缓冲中写入数据,并修改所述最新写入位置。所述ARM用于通过CPU读取和处理所述8个缓冲中存储的数据,并保存和记录最后读取位置。
参考图2至图4,在一个典型的应用场景中,可能出现所述最新写入位置大于所述最后读取位置的情形,亦即所述FPGA写入数据的速度大于所述ARM读取数据的速度。此时,从所述最后读取位置至所述最新写入位置之间的缓冲为有效缓冲,如图2示出的0号和1号缓冲、图3示出的3号和4号缓冲、图4示出的6号和7号缓冲,这些有效缓冲中存储的数据为等待所述ARM的CPU读取和处理的有效数据,所述8个缓冲中除所述有效缓冲之外的缓冲均为待写入缓冲,所述FPGA可以继续按照所述数据写入顺序依次在其中写入数据。
参考图5,在另一个典型的应用场景中,随着所述FPGA按照所述数据写入顺序依次在所述8个缓冲中写入数据,还有可能出现所述最新写入位置小于所述最后读取位置的情形,亦即所述FPGA写入数据的速度大于所述ARM读取数据的速度,且所述FPGA已经循环至向位于所述最后读取位置之前的缓冲写入数据。此时,从所述最后读取位置至第8个缓冲,以及所述第1个缓冲至最新写入位置之间的缓冲为所述有效缓冲,如图5示出的7号和0号缓冲,这些有效缓冲中存储的数据为等待所述ARM的CPU读取和处理的有效数据,所述8个缓冲中除所述有效缓冲之外的缓冲均为待写入缓冲,所述FPGA可以继续按照所述数据写入顺序依次在其中写入数据。
作为一个非限制性实施例,所述n个缓冲可以连续的设置于同一缓冲区中,以使所述FPGA能够在其中顺序写入数据。
作为一个变化例,所述n个缓冲可以分散设置于多个缓冲区,并通过组织结构顺序链接,以充分利用所有的缓冲区,避免资源浪费。进一步地,通过加入组织的描述信息的方式,实现更精准的判断,并通过提升缓冲深度的方式来容纳更大的抖动,有利于保证数据的完整性,更好的解决CPU繁忙导致的数据丢失问题。
由上,采用本实施例的方案,能够根据缓冲深度设立n个缓冲并在其中循环写入数据,通过记录最后读取位置和最新写入位置,使得数据读取端(如ARM的CPU)能够根据自身忙闲情况自行调节读取进度,由于缓冲区的数量足够多(即n个),有效避免出现缓冲的数据还未被执行读取处理就需要写入新数据的情形。
进一步地,采用本发明实施例所述循环缓冲方法使得SOCFPGA系统在采集和转发大数据量的数据时不会产生数据丢失的问题,尤其对于基于低配置可编程器件(如低配置ZYNQ)的系统,能够在极大的节省系统开销的基础上,保证数据完整性,极大地优化系统的数据处理效率。
进一步地,本实施例提出的循环缓冲方案能够保证数据量大且处理时间不规律时数据的完整性。具体地,通过循环缓冲的方式提供非常弹性的缓冲,当CPU繁忙时,数据继续缓冲,当CPU闲时,能够快速的处理完缓冲的所有数据,而不会受制约于瞬间的CPU繁忙导致数据丢失,提升了写模块和读模块的沟通速率,有效改善系统的数据处理效率。
例如,所述系统可以采用ZYNQ 7020型写模块,600MHz双核ARM型读模块以及DDR3型缓冲分别执行本实施例所述方案和现有技术来比较本实施例的实验效果,其中,DDR为双倍速率同步动态随机存储器(Double Data Rate Synchronous Dynamic Random AccessMemory,DDR SDRAM)的英文缩写。
具体地,实验期间,每秒450Mbps数据使用传输控制协议(Transmission ControlProtocol,简称TCP)传输,40Mbps数据通过用户数据报协议(User Datagram Protocol,简称UDP)传输,以监测UDP的丢包率。
其中,采用现有的双缓冲加中断的方案进行数据缓冲期间,所述UDP的丢包率为5%;而采用本实施例所述循环缓冲的方案进行数据缓冲期间,所述UDP的丢包率降低到了0.0007%。
由上,本实施例的方案能够充分发挥低配置可编程器件的性能,在比较低效率的可扩展平台上,依然能够满足产品性能的定义,提升了稳定性。
图6是本发明第二实施例的一种用于SOCFPGA的数据循环缓冲装置的结构示意图。本领域技术人员理解,本实施例所述数据的循环缓冲装置8(以下简称为循环缓冲装置8)可以用于实施上述图1所示实施例中所述的方法技术方案。
具体地,在本实施例中,所述循环缓冲装置8可以包括:写模块81,用于按照数据写入顺序在n个缓冲中顺序写入数据,所述n为正整数并根据缓冲深度确定;确定模块82,用于根据最新写入位置和最后读取位置确定有效缓冲,所述有效缓冲为所述n个缓冲中存储有未被读取数据的缓冲;读模块83,在读取数据时,自所述最后读取位置开始按照数据读取顺序依次读取所述有效缓冲中存储的数据,直至所述最新写入位置。
进一步地,所述数据写入顺序与所述数据读取顺序的方向相同。
进一步地,当第n个缓冲被写入数据后,所述写模块81可以从第1个缓冲开始继续写入数据。
进一步地,当所述第n个缓冲中存储的数据被读取后,所述读模块83可以从第1个缓冲开始继续读取数据。
作为一个非限制性实施例,所述确定模块82可以包括:第一确定子模块821,当所述最新写入位置等于所述最后读取位置,所述有效缓冲的数量为零。
作为另一个非限制性实施例,所述确定模块82可以包括:第二确定子模块822,以所述数据写入顺序为正方向,当所述最新写入位置大于所述最后读取位置时,所述有效缓冲为所述最后读取位置至所述最新写入位置之间的缓冲。
作为又一个非限制性实施例,所述确定模块82可以包括:第三确定子模块823,以所述数据写入顺序为正方向,当所述最新写入位置小于所述最后读取位置时,所述有效缓冲为所述最后读取位置至第n个缓冲,以及所述第1个缓冲至最新写入位置之间的缓冲。
在一个优选例中,所述n个缓冲可以连续的设置于同一缓冲区中。
作为一个变化例,所述n个缓冲可以分散设置于多个缓冲区,并通过组织结构顺序链接。
进一步地,所述写模块81可以集成于所述低配置可编程器件(如低配置ZYNQ)的FPGA;所述确定模块82和度模块83可以集成于所述ARM(如ARM的CPU)。或者,本实施例所述循环缓冲装置8也可以独立于所述FPGA和ARM,并将写入和读取的数据发送至系统的相应模块以供其使用。
需要指出的是,所述第一确定子模块81、第二确定子模块82和第三确定子模块83可以为同一个模块;或者,三者也可以相互独立,以各自在对应的场景下执行确定所述有效缓冲的操作。
进一步地,所述循环缓冲装置8可以集成于所述系统中,以通过执行本实施例所述方案优化所述系统的数据处理效率。
关于所述循环缓冲装置8的工作原理、工作方式的更多内容,可以参照图1中的相关描述,这里不再赘述。
进一步地,本发明实施例还公开一种存储介质,其上存储有计算机指令,所述计算机指令运行时执行上述图1所示实施例中所述的方法技术方案。优选地,所述存储介质可以包括计算机可读存储介质。所述存储介质可以包括ROM、RAM、磁盘或光盘等。
进一步地,本发明实施例还公开一种终端,包括存储器和处理器,所述存储器上存储有能够在所述处理器上运行的计算机指令,所述处理器运行所述计算机指令时执行上述图1所示实施例中所述的方法技术方案。优选地,所述终端可以为所述系统。
虽然本发明披露如上,但本发明并非限定于此。任何本领域技术人员,在不脱离本发明的精神和范围内,均可作各种更动与修改,因此本发明的保护范围应当以权利要求所限定的范围为准。