一种基于异步环形缓冲区的数据读取、写入方法及装置与流程

文档序号:19737691发布日期:2020-01-18 04:44阅读:397来源:国知局
一种基于异步环形缓冲区的数据读取、写入方法及装置与流程

本申请涉及数据处理技术领域,特别是涉及一种基于异步环形缓冲区的数据读取、写入方法及装置。



背景技术:

对计算机系统产品而言,产品升级是平常而且重要的。比如,当旧版本的产品存在已知bug时,通常需要在新版本中完成bug的修复,并利用新版本的产品来更新旧版本的产品,实现产品升级。又比如,当需要在旧版本产品上添加新功能时,用户通常使用升级功能把具有新功能的新版本产品(更新文件/升级文件)下载到本地中,以利用新版本的产品更新旧版本的产品。

目前,对于一般计算机系统产品而言,固件程序都存放在flash硬件芯片中,在进行产品升级时,就是通过升级工具把新版本的固件二进制文件下载存入产品内的flash硬件芯片内。一般的过程是:升级工具把二进制文件分拆成多个数据包通过硬件总线发送到产品系统内,产品系统把数据包缓存到内存中,二进制接收完毕后,再把二进制数据写入flash硬件芯片中,完成升级。

但是,实际应用中,存在部分系统产品的内存比较小,而升级文件可能相对比较大。比如:对于expander这种小型计算机系统而言,其内存可能只有2m(兆),而其升级文件为1.5m,在去除expander运行所需的1m内存后,剩余1m内存不足以缓存升级文件。针对于此,如果产品接收到一包数据包后直接写入flash,不使用内存做缓存,虽然可以不考虑内存大小问题,但实际应用中硬件总线的速度很快,这使得两个数据包发送间隔时间很短,而每发送一包在直接写入flash时,写入flash中所需的时长是波动的。即,可能在较短时间内就可以完成该数据包的写入,也可能会花费较长时间才能完成该数据包的写入,这使得当数据包写入flash的过程需要花费较长时间时,硬件总线就会出现传输超时错误,从而会导致产品升级失败。



技术实现要素:

本申请实施例提供了一种基于异步环形缓冲区的数据读取、写入方法及装置,以实现以较小的缓冲区完成对产品的成功升级。

第一方面,本申请实施例提供了一种基于异步环形缓冲区的数据写入方法,所述方法包括:

根据异步环形缓冲区的最大缓存空间大小以及所述异步环形缓冲区的读指针以及写指针,确定所述异步环形缓冲区的剩余存储空间大小;

若所述剩余存储空间大小不小于待写入数据的数据大小,则根据所述写指针将所述待写入数据写入所述异步环形缓冲区的剩余存储空间;

其中,当所述待写入数据写入至所述异步环形缓冲区中可写入数据的尾地址处并且所述待写入数据未写入完全时,所述待写入数据在所述异步环形缓冲区中可写入数据的首地址处继续写入;

根据所述异步环形缓冲区的写指针以及所述待写入数据的数据大小,更新所述异步环形缓冲区的写指针。

在一些可能的实施方式中,所述方法还包括:

在将所述待写入数据写入所述异步环形缓冲区之前,申请互斥锁锁定数据写入操作。

在一些可能的实施方式中,所述方法还包括:

在完成将所述待写入数据写入所述异步环形缓冲区之后,释放所述互斥锁。

所述根据所述异步环形缓冲区的写指针以及所述待写入数据的数据大小,更新所述异步环形缓冲区的写指针

在一些可能的实施方式中,所述异步环形缓冲区的最大缓存空间的地址用一维数组表征,所述一维数组的长度为所述最大缓存空间的地址长度。

第二方面,本申请实施例还提供了一种基于异步环形缓冲区的数据读取方法,所述方法包括:

根据异步环形缓冲区的最大缓存空间大小以及所述异步环形缓冲区的读指针以及写指针,确定所述异步环形缓冲区的缓存数据大小;

比较所述缓存数据大小以及目标读取数据大小,确定目标数据大小,所述目标数据大小为所述缓存数据大小与所述目标读取数据大小中的较小值;

根据所述读指针以及所述目标数据大小,读取所述异步环形缓冲区中的缓存数据;

其中,当读取至所述异步环形缓冲区中可读取数据的尾地址处并且所述待读取数据未读取完全时,在所述异步环形缓冲区中可读取数据的首地址处继续读取所述待读取数据;

根据所述读指针以及所述目标数据大小,更新所述异步环形缓冲区的读指针。

在一些可能的实施方式中,所述方法还包括:

在读取所述异步环形缓冲区中的缓存数据之前,申请互斥锁锁定数据写入操作。

在一些可能的实施方式中,所述方法还包括:

在完成读取所述异步环形缓冲区中的缓存数据之后,释放所述互斥锁。

在一些可能的实施方式中,所述异步环形缓冲区的最大缓存空间的地址用一维数组表征,所述一维数组的长度为所述最大缓存空间的地址长度。

第三方面,本申请实施例还提供了一种基于异步环形缓冲区的数据写入装置,所述装置包括:

确定模块,用于根据异步环形缓冲区的最大缓存空间大小以及所述异步环形缓冲区的读指针以及写指针,确定所述异步环形缓冲区的剩余存储空间大小;

写入模块,用于若所述剩余存储空间大小不小于待写入数据的数据大小,则根据所述写指针将所述待写入数据写入所述异步环形缓冲区的剩余存储空间;

其中,当所述待写入数据写入至所述异步环形缓冲区中可写入数据的尾地址处并且所述待写入数据未写入完全时,所述待写入数据在所述异步环形缓冲区中可写入数据的首地址处继续写入;

更新模块,用于根据所述异步环形缓冲区的写指针以及所述待写入数据的数据大小,更新所述异步环形缓冲区的写指针。

在一些可能的实施方式中,所述装置还包括:

申请模块,用于在将所述待写入数据写入所述异步环形缓冲区之前,申请互斥锁锁定数据写入操作。

在一些可能的实施方式中,所述装置还包括:

释放模块,用于在完成将所述待写入数据写入所述异步环形缓冲区之后,释放所述互斥锁。

在一些可能的实施方式中,所述异步环形缓冲区的最大缓存空间的地址用一维数组表征,所述一维数组的长度为所述最大缓存空间的地址长度。

第四方面,本申请实施例还提供了一种基于异步环形缓冲区的数据读取装置,所述装置包括:

确定模块,用于根据异步环形缓冲区的最大缓存空间大小以及所述异步环形缓冲区的读指针以及写指针,确定所述异步环形缓冲区的缓存数据大小;

比较模块,用于比较所述缓存数据大小以及目标读取数据大小,确定目标数据大小,所述目标数据大小为所述缓存数据大小与所述目标读取数据大小中的较小值;

读取模块,用于根据所述读指针以及所述目标数据大小,读取所述环形缓存区中的缓存数据;

其中,当读取至所述异步环形缓冲区中可读取数据的尾地址处并且所述待读取数据未读取完全时,在所述异步环形缓冲区中可读取数据的首地址处继续读取所述待读取数据;

更新模块,用于根据所述读指针以及所述目标数据大小,更新所述异步环形缓冲区的读指针。

在一些可能的实施方式中,所述装置还包括:

申请模块,用于在读取所述异步环形缓冲区中的缓存数据之前,申请互斥锁锁定数据写入操作。

在一些可能的实施方式中,所述装置还包括:

释放模块,用于在完成读取所述异步环形缓冲区中的缓存数据之后,释放所述互斥锁。

在一些可能的实施方式中,所述异步环形缓冲区的最大缓存空间的地址用一维数组表征,所述一维数组的长度为所述最大缓存空间的地址长度。

在本申请实施例的上述实现方式中,在基于异步环形缓冲区进行数据写入时,可以根据环形缓冲区的最大缓存空间大小以及该环形缓冲区的读指针和写指针,确定该环形缓冲区的剩余存储空间大小;若该剩余存储空间大小不小于待写入数据的数据大小,则可以根据写指针将待写入数据写入环形缓冲区的剩余存储空间;其中,当该待写入数据写入至异步环形缓冲区中可写入数据的尾地址处并且该待写入数据未写入完全时,该待写入数据在所述异步环形缓冲区中可写入数据的首地址处继续写入;然后,根据该环形缓冲区的写指针以及所述待写入数据的数据大小,更新该异步环形缓冲区的写指针。相应的,在基于异步环形缓冲区进行数据读取时,可以根据异步环形缓冲区的最大缓存空间大小以及异步环形缓冲区的读指针和写指针,确定异步环形缓冲区的缓存数据大小;然后,比较缓存数据大小以及目标读取数据大小,确定目标数据大小,其中,目标数据大小为缓存数据大小与目标读取数据大小中的较小值;接着,根据该读指针以及目标数据大小,可以读取环形缓存区中的缓存数据;其中,当读取至异步环形缓冲区中可读取数据的尾地址处并且该待读取数据未读取完全时,在异步环形缓冲区中可读取数据的首地址处继续读取待读取数据;最后,根据读指针以及目标数据大小,可以更新异步环形缓冲区的读指针。

可见,在对系统产品进行升级时,数据可以不断的写入该异步环形缓冲区中,从而在基于硬件总线将数据写入异步环形缓冲区中时,可以保证硬件总线发送数据包不会超时;而且,还可以同时从异步环形缓冲区中将写入的数据包读取并写入flash,即使写入某个数据包在写入flash的过程中出现时延抖动,也不会使得硬件总线出现数据包超时。由于采用异步环形缓冲区可以使得在写入或者读出时具有连续性,即数据在写入至缓冲区的尾地址后可以继续从该缓冲区的首地址处进行数据存储,相应的,在读取缓冲区的尾地址所存储的数据后可以继续从该缓冲区的首地址处读取数据,这使得数据写入以及数据读取可以采用异步操作,而这种边写边读的数据处理过程不仅可以减少数据最终写入flash等硬件存储器所需消耗的内存,而且,这相比于先将全部数据写入内存再从内存将的全部数据读出并写入硬件存储器的实施方式而言,耗时更短,效率更高。

附图说明

为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请中记载的一些实施例,对于本领域普通技术人员来讲,还可以根据这些附图获得其他的附图。

图1为本申请实施例中一示例性应用场景示意图;

图2为本申请实施例中一种基于异步环形缓冲区的数据读取、写入方法流程示意图;

图3为本申请实施例中一种读指针小于写指针的示意图;

图4为本申请实施例中读指针大于写指针的示意图;

图5为本申请实施例中读指针等于写指针的示意图;

图6为本申请实施例中一种基于异步环形缓冲区的数据读取装置的结构示意图;

图7为本申请实施例中一种基于异步环形缓冲区的数据写入装置的结构示意图。

具体实施方式

实际应用中,对于一些小型的计算机系统,其内存通常较小,在进行系统产品升级更新时,升级文件的大小可能超过该内存的剩余内存空间的大小,使得在该计算机系统内无法缓存升级文件。而若直接将该升级文件存储于flash中,而不用内存作为缓存,虽然对于计算机内存不做要求,但是由于实际应用场景中升级文件是通过硬件总线传输至flash中,并且,硬件总线的传输速度通常较快,使得升级文件中的两个相邻数据包的发送间隔时间很短,若前一数据包能够在该发送时间间隔内成功写入flash,则后一数据包可以顺利进行发送,而若前一数据包未在该发送时间间隔内成功写入flash,则硬件总线会出现传输超时错误,影响后续数据包发送失败,从而会导致产品升级失败。

基于此,本申请实施例提供了一种基于异步环形缓冲区的数据读取、写入方法,通过在环形缓冲区中写入以及读取数据,实现以较小的缓冲区完成对产品的成功升级。具体的,在基于异步环形缓冲区进行数据写入时,可以根据环形缓冲区的最大缓存空间大小以及该环形缓冲区的读指针和写指针,确定该环形缓冲区的剩余存储空间大小;若该剩余存储空间大小不小于待写入数据的数据大小,则可以根据写指针将待写入数据写入环形缓冲区的剩余存储空间;其中,当该待写入数据写入至异步环形缓冲区中可写入数据的尾地址处并且该待写入数据未写入完全时,该待写入数据在所述异步环形缓冲区中可写入数据的首地址处继续写入;然后,根据该环形缓冲区的写指针以及所述待写入数据的数据大小,更新该异步环形缓冲区的写指针。相应的,在基于异步环形缓冲区进行数据读取时,可以根据异步环形缓冲区的最大缓存空间大小以及异步环形缓冲区的读指针和写指针,确定异步环形缓冲区的缓存数据大小;然后,比较缓存数据大小以及目标读取数据大小,确定目标数据大小,其中,目标数据大小为缓存数据大小与目标读取数据大小中的较小值;接着,根据该读指针以及目标数据大小,可以读取环形缓存区中的缓存数据;其中,当读取至异步环形缓冲区中可读取数据的尾地址处并且该待读取数据未读取完全时,在异步环形缓冲区中可读取数据的首地址处继续读取待读取数据;最后,根据读指针以及目标数据大小,可以更新异步环形缓冲区的读指针。

可见,在对系统产品进行升级时,数据可以不断的写入该异步环形缓冲区中,从而在基于硬件总线将数据写入异步环形缓冲区中时,可以保证硬件总线发送数据包不会超时;而且,还可以同时从异步环形缓冲区中将写入的数据包读取并写入flash,即使写入某个数据包在写入flash的过程中出现时延抖动,也不会使得硬件总线出现数据包超时。由于采用异步环形缓冲区可以使得在写入或者读出时具有连续性,即数据在写入至缓冲区的尾地址后可以继续从该缓冲区的首地址处进行数据存储,相应的,在读取缓冲区的尾地址所存储的数据后可以继续从该缓冲区的首地址处读取数据,这使得数据写入以及数据读取可以采用异步操作,而这种边写边读的数据处理过程不仅可以减少数据最终写入flash等硬件存储器所需消耗的内存,而且,这相比于先将全部数据写入内存再从内存将的全部数据读出并写入硬件存储器的实施方式而言,耗时更短,效率更高。

作为一种示例,本申请实施例可以应用于如图1所示的示例性应用场景。在该场景中,终端101上具有用于更新expander系统102的产品升级文件,并且,终端101与expander系统102之间可以通过usb总线进行数据交互。当需要对expander系统102的产品进行升级时,终端101可以将升级文件通过usb总线发送给expander系统102;expander系统102在接收升级文件(包含多个数据包)的过程中,可以先根据自身的expander系统102的异步环形缓冲区的最大缓存空间大小以及该异步环形缓存区的读指针和写指针,确定出该异步环形缓冲区的剩余存储空间大小,并且,若确定该剩余存储空间大小不小于数据包的数据大小,则可以该写指针将该数据包写入异步环形缓冲区的剩余存储空间。其中,数据包在被写入异步环形缓冲区的过程中,当该数据包写入至该异步环形缓冲区中可写入数据的尾地址处并且该数据包未写入完全时,该数据包在异步环形缓冲区中可写入数据的首地址处继续写入,并根据写指针以及该数据包的大小,更新写指针。而在将写入异步环形缓冲区中的数据写入expander系统102的flash存储器中时,expander系统102可以异步环形缓冲区的最大缓存空间大小以及该异步环形缓冲区的读指针和写指针,确定出当前异步环形缓冲区的缓存数据大小;然后,expander系统102可以比较缓存数据大小与此次所要读取数据的大小,确定其中的较小值,并以该较小值从异步环形缓冲区的读指针处开始读取缓存数据。其中,当读取到异步环形缓冲区中可读取数据的尾地址处并且数据未读取完全时,可以在所述异步环形缓冲区中可读取数据的首地址处继续读取缓存数据;而当数据读取完全后,可以根据该读指针以及此次所读取的数据大小(即为上述较小值),更新读指针。按照该过程,可以一边向expander系统102的异步环形缓冲区中写入数据,一边将写入该缓冲区的数据读出并且写入expander系统102的flash存储器中,从而可以以较小的缓存区实现较大的升级文件的成功写入flash中,从而完成expander系统102的产品升级。

可以理解的是,上述场景仅是本申请实施例提供的一个场景示例,本申请实施例并不限于此场景。比如,在其他可能的实施方式中,本申请实施例的技术方案也可以是应用于其他小型计算机系统中,而不局限于上述expander系统102。又比如,在本申请实施例不限于应用在产品升级的场景中,对于内存不足,数据读写频率较高的应用场景,都可以应用于本申请实施例的技术方案。总之,本申请实施例可以应用于任何可适用的应用场景,而不局限于上述场景示例。

为使本申请的上述目的、特征和优点能够更加明显易懂,下面将结合附图对本申请实施例中的各种非限定性实施方式进行示例性说明。显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本申请保护的范围。

参阅图2,图2示出了本申请实施例中一种基于异步环形缓冲区的数据写入、读取方法的流程示意图,该方法具体可以包括:

s201:根据异步环形缓冲区的最大缓存空间大小以及该异步环形缓冲区的读指针以及写指针,确定该异步环形缓冲区的剩余存储空间大小。

本实施例中,在将数据一次性写入异步环形缓冲区之前,可以预先确定异步环形缓冲区是否具有足够的存储空间去缓存数据。若存储空间足够,则可以将该数据写入该异步环形缓冲区,而若存储空间不够,则通常无法一次性将该数据全部写入异步环形缓存区,此时,可以触发报警或者进行缓存报错提示。

需要说明的是,本实施例中,可以设置读指针以及写指针来标识数据读写时的起始地址。以写指针为例,写指针可以标识出数据被写入异步环形缓冲区时数据的起始缓存地址,如当写指针指向存储地址0082时,若存在数据需要缓存至该异步环形缓冲区中,则第一个数据可以被缓存在该写指针所指向的存储地址0082,而第二个、第三个数据可以依次按照地址顺序被缓存于存储地址0083以及存储地址0084中。相应的,在读取异步环形缓冲区中的缓存数据时,即可以从读指针所指向的存储地址处开始读取数据。基于此,本实施例中按照地址顺序,读指针至写指针之间的地址空间通常已缓存数据,而写指针至读指针之间的地址空间通常未缓存数据,即为剩余存储空间。如图3所示,在读指针至写指针之间的空白区域,为已缓存数据的区域,而写指针至读指针之间的阴影区域,为尚未缓存数据的区域。

在一种示例性的具体实施方式中,在确定异步环形缓冲区的剩余存储空间大小的过程中,具体可以是根据异步环形缓冲区的最大缓存空间大小以及该异步环形缓冲区的读指针以及写指针来进行确定。如图3所示,该异步环形缓冲区中的最大缓存空间大小为size,读指针所指向的存储地址为rp,写指针所指向的存储地址为wp(wp>rp),则该异步环形缓冲区的剩余存储空间大小为|size-(wp-rp)|。

值得注意的是,在图3所示的示例中,wp>rp,而在其他可能的场景示例中,写指针所指向的存储地址wp也可能小于读指针所指向的存储地址rp,如图4所示,则异步环形缓冲区的剩余存储空间为wp至rp,剩余存储空间大小为(rp-wp)。

另外,当写指针所指向的存储地址wp与读指针所指向的存储地址rp相等时,如图5所示,则异步环形缓冲区的剩余存储空间大小等于最大缓存空间大小size。

作为一种示例,可以一维数组来表征异步环形缓冲区的最大缓存空间的地址,相应的,该一维数组的长度可以是该最大缓存空间的地址长度。

s202:若确定剩余存储空间大小不小于待写入数据的数据大小,则根据该写指针将待写入数据写入所述异步环形缓冲区的剩余存储空间;其中,当待写入数据写入至异步环形缓冲区中可写入数据的尾地址处并且该待写入数据未写入完全时,该待写入数据在异步环形缓冲区中可写入数据的首地址处继续写入。

可以理解,当剩余存储空间大小不小于待写入数据的数据大小时,表明当前异步环形缓冲区具有足够的存储空间去缓存待写入数据,因此,可以将该待写入数据写入异步环形缓冲区的剩余存储空间中。具体实现时,可以按照地址顺序,以写指针所指向的存储地址处开始缓存待写入数据。即,该待写入数据中的第一个数据,可以被写入至写指针所指向的存储地址a,而该待写入数据中的第二个数据,可以被写入至存储地址a的下一个存储地址b中,以此类推。

需要说明的是,在将待写入数据写入异步环形缓存区的过程中,若待写入数据写入至该异步环形缓冲区中可写入数据的尾地址处并且该待写入数据未写入完全时,该待写入数据在该异步环形缓冲区中可写入数据的首地址处继续写入。举例来说,假设异步环形缓存区的存储地址为0000(首地址)至2048(尾地址),则在将待写入数据写入尾地址2048后,若待写入数据中仍存在部分数据未写入至异步环形缓冲区中,则可以在该异步环形缓冲区的首地址0000处继续缓存待写入数据中未写入的数据。本实施例中,异步环形缓冲区中的“环形”是指数据在该缓冲区中进行存储时是连续的,即当数据缓存至存储地址2048位置后,从存储地址0000处继续缓存数据。相应的,从缓冲区中读取的数据也是连续的,从存储地址2048处读取已缓存数据之后,从存储地址0000处继续读取已缓存数据。

s203:根据异步环形缓冲区的写指针以及待写入数据的数据大小,更新异步环形缓冲区的写指针。

本实施例中,在将待写入数据写入异步环形缓冲区后,可以更新异步环形缓冲区中的写指针。具体实现时,当写指针所指向的存储地址与异步环形缓冲区中可写入数据的尾地址之间的存储空间大小大于待写入数据的大小时,更新后的写指针所指向的存储地址为(wp+w)。其中,“wp”为更新前写指针所指向的存储地址,“w”为待写入数据的大小。当写指针所指向的存储地址与异步环形缓冲区中可写入数据的尾地址之间的存储空间大小等于待写入数据的大小时,更新后的写指针所指向的存储地址即为异步环形缓冲区中可写入数据的首地址。当写指针所指向的存储地址与异步环形缓冲区中可写入数据的尾地址之间的存储空间大小小于待写入数据的大小时,写指针所指向的存储地址与异步环形缓冲区中可写入数据的尾地址之间的存储空间不足以存储整个待写入数据,则待写入数据中的剩余部分数据可以从异步环形缓冲区中可写入数据的首地址处开始进行存储,相应的,更新后的写指针所指向的存储地址即为(w-(lp-wp)),其中,“wp”为更新前写指针所指向的存储地址,“w”为待写入数据的大小,“lp”为异步环形缓冲区中可写入数据的尾地址。

实际应用中,为了保证向异步环形缓冲区中写入数据的过程中不受数据读操作的影响,在一些可能的实施方式中,可以在将待写入数据(数据包)写入异步环形缓冲区之前,申请互斥锁锁定数据写入操作,这样,在同一时间,只可以在异步环形缓冲区中进行数据包的写入操作,而无法进行数据的读出操作。

相应的,在完成将待写入数据(数据包)写入异步环形缓冲区后,可以进行数据的读取操作,比如,执行后续步骤s204至步骤s207以实现缓存数据的读取等,此时,为了避免对数据读取操作的影响,可以释放已经申请的针对于写入操作的互斥锁。

s204:根据异步环形缓冲区的最大缓存空间大小以及该异步环形缓冲区的读指针和写指针,确定该异步环形缓冲区的缓存数据大小。

本实施例中,在数据被缓存至异步环形缓冲区中后,可以将缓存的数据进行读出,以便将缓存的数据写入相应的硬件中,如flash存储器等。

而每次需要读取异步环形缓冲区中的数据时,可以先确定该异步环形缓冲区中已缓存的数据大小,以便后续能够确定出从异步环形缓冲区中可以读取多少数据。具体实现时,可以是根据异步环形缓冲区的最大缓存空间大小以及该异步环形缓冲区的读指针和写指针,确定出该异步环形缓冲区的缓存数据大小。比如,如图3所示,当读指针所指向的存储地址rp小于写指针所指向的存储地址wp时,该异步环形缓冲区中具有缓存数据的存储空间为rp至wp,缓存数据大小为((wp-rp)*每个存储地址所能存储的数据量)。而当读指针所指向的存储地址rp大于指针所指向的存储地址wp时,如图4所示,则,该异步环形缓冲区中具有缓存数据的存储空间为首地址至wp(wp-1),以及rp至尾地址,而缓存数据大小为该存储空间与每个存储地址所能存储的数据量之间的乘积;其中,首地址是指异步环形缓冲区中可缓存(写入)数据的首地址,类似的,尾地址是指异步环形缓冲区中可缓存(写入)数据的尾地址。当读指针所指向的存储地址rp等于指针所指向的存储地址wp时,如图5所示,则异步环形缓冲区中未缓存有数据。

s205:比较所确定出的缓存数据大小以及目标读取数据大小,确定目标数据大小,所述目标数据大小为所述缓存数据大小与所述目标读取数据大小中的较小值。

实际应用中,在从异步环形缓冲区中读取数据时,所读取的数据量是由所期望读取的数据大小(即目标读取数据大小)与异步环形缓冲区中所具有的缓存数据大小决定的,具体为目标读取数据大小以及缓存数据大小中的较小值。比如,假设期望读出的数据大小为100字节,而异步环形缓冲区中所具有的缓存数据只有90字节,则从异步环形缓冲区中最多只能读出90字节的数据,即最终读取的数据长度为100字节和90字节中的较小值;又比如,假设期望读出的数据大小为50字节,而异步环形缓冲区中所具有的缓存数据仍然为90字节,则从异步环形缓冲区中仅需读取50字节的缓存数据即可,也即最终读取的数据长度为50字节和90字节中的较小值。

s206:根据读指针以及所述目标数据大小,读取异步环形缓冲区中的缓存数据;其中,当读取至异步环形缓冲区中可读取数据的尾地址处并且待读取数据未读取完全时,在异步环形缓冲区中可读取数据的首地址处继续读取待读取数据。

具体实现时,可以按照地址顺序,以读指针所指向的存储地址处开始读取缓存数据(也即待读取数据)。即,从读指针所指向的存储地址a中读取第一个数据,然后,从存储地址a的下一个存储地址b中,读取第二个数据,以此类推。

需要说明的是,在异步环形缓存区中读取数据的过程中,若读取至异步环形缓冲区中可读取数据的尾地址处并且待读取数据未读取完全时,在异步环形缓冲区中可读取数据的首地址处继续读取待读取数据。举例来说,假设异步环形缓存区的存储地址为0000(首地址)至2048(尾地址),则在读取完尾地址2048中的缓存数据后,若数据读取过程未完成(即读取操作未结束)中,则可以在该异步环形缓冲区的首地址0000处继续读取以缓存的数据。本实施例中,异步环形缓冲区中的“环形”是指在从异步环形缓冲区中读取数据是连续的,即当读取至存储地址2048位置后,从存储地址0000处继续读取数据。

s207:根据读指针以及目标数据大小,更新异步环形缓冲区的读指针。

本实施例中,在完成缓存数据的读取后,可以更新异步环形缓冲区的读指针。具体实现时,按照地址顺序,当读取指针所指向的存储地址小于写指针所指向的存储地址时,更新后的读指针所指向的存储地址为(rp+r),其中,“rp”为更新前读指针所指向的存储地址,“r”为本次所读取数据的大小。而当读指针所指向的存储地址与写指针所指向的存储地址相等时,本次未从异步环形缓冲区中读取到缓存数据,则读指针所指向的存储地址保持不变。而读取指针所指向的存储地址小于写指针所指向的存储地址时,在读取至异步环形缓冲区中可读取数据的尾地址后,继续从异步环形缓冲区中可读取数据的首地址处读取数据,则更新后的读指针所指向的存储地址为(r-(lp-rp)),其中,“rp”为更新前读指针所指向的存储地址,“r”为待读取数据的大小,“lp”为异步环形缓冲区中可读取数据的尾地址(通常与可写入数据的尾地址相同)。

实际应用中,为了保证在异步环形缓冲区中读取数据的过程中不受数据写入操作的影响,在一些可能的实施方式中,可以在从异步环形缓冲区中读取待读取数据之前,申请互斥锁锁定数据读取操作,这样,在同一时间,只可以在异步环形缓冲区中进行数据的读取操作,而无法进行数据的写入操作。

相应的,在完成读取异步环形缓冲区中的缓存数据后,可以进行数据的写入操作,比如,可以继续缓存下一个数据包等(可以理解,在产品升级场景中,升级文件包括多个数据包)。此时,为了避免对下一数据包的写入操作的影响,可以释放已经申请的针对于读取操作的互斥锁。

本实施例中,若应用于产品升级场景中,在对系统产品进行升级时,数据可以不断的写入该异步环形缓冲区中,从而在基于硬件总线将数据写入异步环形缓冲区中时,可以保证硬件总线发送数据包不会超时;而且,还可以同时从异步环形缓冲区中将写入的数据包读取并写入flash,即使写入某个数据包在写入flash的过程中出现时延抖动,也不会使得硬件总线出现数据包超时。由于采用异步环形缓冲区可以使得在写入或者读出时具有连续性,即数据在写入至缓冲区的尾地址后可以继续从该缓冲区的首地址处进行数据存储,相应的,在读取缓冲区的尾地址所存储的数据后可以继续从该缓冲区的首地址处读取数据,这使得数据写入以及数据读取可以采用异步操作,而这种边写边读的数据处理过程不仅可以减少数据最终写入flash等硬件存储器所需消耗的内存,而且,这相比于先将全部数据写入内存再从内存将的全部数据读出并写入硬件存储器的实施方式而言,耗时更短,效率更高。当然,本申请实施例还可以应用于其它应用场景中,不限于产品升级场景。

此外,本申请实施例还提供了一种基于异步环形缓冲区的数据写入装置。参阅图6,图6示出了本申请实施例中一种基于异步环形缓冲区的数据写入装置的结构示意图,该装置600包括:

确定模块601,用于根据异步环形缓冲区的最大缓存空间大小以及所述异步环形缓冲区的读指针以及写指针,确定所述异步环形缓冲区的剩余存储空间大小;

写入模块602,用于若所述剩余存储空间大小不小于待写入数据的数据大小,则根据所述写指针将所述待写入数据写入所述异步环形缓冲区的剩余存储空间;

其中,当所述待写入数据写入至所述异步环形缓冲区中可写入数据的尾地址处并且所述待写入数据未写入完全时,所述待写入数据在所述异步环形缓冲区中可写入数据的首地址处继续写入;

更新模块603,用于根据所述异步环形缓冲区的写指针以及所述待写入数据的数据大小,更新所述异步环形缓冲区的写指针。

在一些可能的实施方式中,所述装置600还包括:

申请模块,用于在将所述待写入数据写入所述异步环形缓冲区之前,申请互斥锁锁定数据写入操作。

在一些可能的实施方式中,所述装置600还包括:

释放模块,用于在完成将所述待写入数据写入所述异步环形缓冲区之后,释放所述互斥锁。

在一些可能的实施方式中,所述异步环形缓冲区的最大缓存空间的地址用一维数组表征,所述一维数组的长度为所述最大缓存空间的地址长度。

值得注意的是,本实施例所描述的写入装置,对应于前述方法实施例中所描述的写入方法,其具体实现可参阅方法实施例中相关之处的描述,在此不做赘述。

另外,本申请实施例还提供了一种基于异步环形缓冲区的数据读取装置。参阅图7,图7示出了本申请实施例中一种基于异步环形缓冲区的数据读取装置的结构示意图,所述装置700包括:

确定模块701,用于根据异步环形缓冲区的最大缓存空间大小以及所述异步环形缓冲区的读指针以及写指针,确定所述异步环形缓冲区的缓存数据大小;

比较模块702,用于比较所述缓存数据大小以及目标读取数据大小,确定目标数据大小,所述目标数据大小为所述缓存数据大小与所述目标读取数据大小中的较小值;

读取模块703,用于根据所述读指针以及所述目标数据大小,读取所述环形缓存区中的缓存数据;

其中,当读取至所述异步环形缓冲区中可读取数据的尾地址处并且所述待读取数据未读取完全时,在所述异步环形缓冲区中可读取数据的首地址处继续读取所述待读取数据;

更新模块704,用于根据所述读指针以及所述目标数据大小,更新所述异步环形缓冲区的读指针。

在一些可能的实施方式中,所述装置700还包括:

申请模块,用于在读取所述异步环形缓冲区中的缓存数据之前,申请互斥锁锁定数据写入操作。

在一些可能的实施方式中,所述装置700还包括:

释放模块,用于在完成读取所述异步环形缓冲区中的缓存数据之后,释放所述互斥锁。

在一些可能的实施方式中,所述异步环形缓冲区的最大缓存空间的地址用一维数组表征,所述一维数组的长度为所述最大缓存空间的地址长度。

值得注意的是,本实施例所描述的读取装置,对应于前述方法实施例中所描述的读取方法,其具体实现可参阅方法实施例中相关之处的描述,在此不做赘述。

通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到上述实施例方法中的全部或部分步骤可借助软件加通用硬件平台的方式来实现。基于这样的理解,本申请的技术方案可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如只读存储器(英文:read-onlymemory,rom)/ram、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者诸如路由器等网络通信设备)执行本申请各个实施例或者实施例的某些部分所述的方法。

本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中作为分离部件说明的模块可以是或者也可以不是物理上分开的,作为模块显示的部件可以是或者也可以不是物理模块,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。

以上所述仅是本申请示例性的实施方式,并非用于限定本申请的保护范围。

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