CN101567849B - 一种数据缓存方法和装置 - Google Patents
一种数据缓存方法和装置 Download PDFInfo
- Publication number
- CN101567849B CN101567849B CN2009101069234A CN200910106923A CN101567849B CN 101567849 B CN101567849 B CN 101567849B CN 2009101069234 A CN2009101069234 A CN 2009101069234A CN 200910106923 A CN200910106923 A CN 200910106923A CN 101567849 B CN101567849 B CN 101567849B
- Authority
- CN
- China
- Prior art keywords
- state
- frame buffer
- data
- frame
- buffer
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Images
Landscapes
- Memory System Of A Hierarchy Structure (AREA)
Abstract
本发明适用于数据存储领域,提供了一种数据缓存方法、装置及设备,所述方法包括下述步骤:将内存的存储空间配置为多块帧缓存,并设置每块帧缓存的状态,所述帧缓存的状态用于标识帧缓存的数据存储状态;在当前帧数据缓存完毕前,根据每块帧缓存的状态确定用于缓存下一帧数据的帧缓存,并根据每块帧缓存的状态以及预设的状态更新条件下的状态更新机制,更新每块帧缓存的状态。本发明实施例在缓存当前数据帧时,即确定下一数据帧的缓存任务,从而保证在当前新的一帧数据缓存完毕时,可以快速的切换到用于缓存下一数据帧的帧缓存,避免了数据丢失。本发明实施例同时可以提高编码效率。
Description
技术领域
本发明属于数据存储领域,尤其涉及一种数据缓存方法和装置。
背景技术
在接收数据时,为了使接收的数据在重现(如播放)时流畅,不产生卡屏现象,一般需要在用于接收和重现数据的设备中内置存储设备(也称为内存),通过内存对接收的数据进行缓存。由于用于缓存的内存的存储空间不可能无限大,因此,为了达到较好的数据重现效果,需要设计较合理的数据缓存方法。
现有技术提供了一种乒乓形式的数据缓存方法,简述如下:采用两块缓存分别为缓存A和缓存B,当缓存A在缓存数据时,将缓存B提供给编码或处理程序使用,当缓存A中的数据缓存完毕时,向缓存B中传输数据,同时将缓存A提供给编码或处理程序使用。这种数据缓存方法对编码程序的实时性要求较高,一般要求编码或处理程序的运行速度快于采集数据的速度,否则数据就会丢失;当采集速度太快,两块缓存都满的时候,需要硬件上能够暂停采集,对硬件功能有要求;编码程序可能一次需要多帧原始数据,以避免内存拷贝,提高编码效率,乒乓操作的双缓冲方式无法满足。
现有技术提供另一种采用缓存队列的数据缓存方法,简述如下:将采用缓存队列对数据采集完毕的帧缓存进行管理,当编码程序需要一帧新的数据的时候,从缓存队列中获取一帧数据。这种数据缓存方法由于没有标识为准备状态的帧缓存,难以保证在当前帧接收完时,马上有下一帧缓存供数据采集使用;从缓存队列中获取一帧数据时,需要把数据从帧缓存中拷贝出来,降低了编码程序的效率;编码程序无法一次获取多帧数据或者释放多帧数据。
发明内容
本发明的目的在于提供一种数据缓存方法,旨在解决采用内存缓存数据时,当帧缓存接收完一帧数据后,可快速的切换到另一个帧缓存来接收下一帧数据,从而在内存的容量可以满足当前数据存储需要时,避免了具有恒定速度或流量的数据帧丢失的问题。
本发明是这样实现的,一种内存的数据缓存方法,所述内存的存储空间被配置为多块帧缓存,所述方法包括下述步骤:
A、设置每块帧缓存的状态,所述帧缓存的状态用于标识帧缓存的数据存储状态,所述帧缓存的状态包括正在缓存数据状态、准备缓存数据状态、已经缓存数据状态、被数据占用状态、以及空闲状态;
B、在当前帧数据缓存完毕前,根据每块帧缓存的状态确定用于缓存下一帧数据的帧缓存,并根据每块帧缓存的状态以及预设的状态更新条件下的状态更新机制,更新每块帧缓存的状态,所述状态更新条件包括一帧数据缓存完毕、读取帧缓存、以及释放帧缓存。
进一步的,所述步骤B具体包括:
B1、实时检测数据存储状态是否达到预设的状态更新条件;
B2、在当前帧数据缓存完毕时,将下一帧数据传输至处于准备缓存数据状态的帧缓存,并准备处于空闲状态的其中一块帧缓存以用来存储再下一帧数据,同时将处于正在缓存数据状态的帧缓存的状态更新为已经缓存数据状态,将处于准备缓存数据状态的帧缓存的状态更新为正在缓存数据状态,将处于空闲状态的其中一块帧缓存的状态更新为准备缓存数据状态;
B3、当读取帧缓存时,将读取的帧缓存的状态更新为被数据占用状态;
B4、当释放帧缓存时,将被释放的帧缓存的状态更新为空闲状态。
进一步的,所述方法还包括下述步骤:
设置先进先出的已缓存数据队列和数据占用队列,当所述帧缓存的状态为已经缓存数据状态时,使所述帧缓存进入所述已缓存数据队列,当所述帧缓存的状态为被数据占用状态时,使所述帧缓存进入所述数据占用队列。
进一步的,
所述步骤B2具体包括B2’、如果当前帧数据缓存完毕,将下一帧数据传输至处于准备缓存数据状态的帧缓存,并采用处于空闲状态的其中一块帧缓存存储再下一帧数据,同时将处于正在缓存数据状态的帧缓存的状态更新为已经缓存数据状态,将处于准备缓存数据状态的帧缓存的状态更新为正在缓存数据状态,如果当前不存在处于空闲状态的帧缓存,按照先进先出的顺序,将最早进入所述已缓存数据队列中帧缓存的状态更新为准备缓存数据状态,或者动态申请一块新的帧缓存,并将所述新的帧缓存的状态设为准备缓存数据状态,同时动态调整内存的存储空间的帧缓存总数;
所述步骤B3具体包括B3’、当读取帧缓存时,按照先进先出的顺序,将所述已缓存数据队列中的被读取的一块或者多块帧缓存的状态更新为被数据占用状态;
所述步骤B4具体包括B4’、当释放帧缓存时,按照先进先出的顺序,将所述数据占用队列中被释放的一块或者多块帧缓存的状态更新为空闲状态。
本发明的另一目的在于提供一种内存的数据缓存装置,所述内存的存储空间被配置为多块帧缓存,所述装置包括:
帧缓存配置单元,用于设置每块帧缓存的状态,所述帧缓存的状态用于标识帧缓存的数据存储状态,所述帧缓存的状态包括正在缓存数据状态、准备缓存数据状态、已经缓存数据状态、被数据占用状态、以及空闲状态;
数据缓存单元,用于在当前帧数据缓存完毕前,根据每块帧缓存的状态确定用于缓存下一帧数据的帧缓存,并根据每块帧缓存的状态以及预设的状态更新条件下的状态更新机制,更新每块帧缓存的状态,所述状态更新条件包括一帧数据缓存完毕、读取帧缓存、以及释放帧缓存。
进一步的,所述数据缓存单元包括:
条件检测子单元,用于实时检测数据存储状态是否达到预设的状态更新条件;
数据传输子单元,用于在所述条件检测子单元检测到数据存储状态达到一帧数据缓存完毕的状态更新条件时,向处于准备缓存数据状态的帧缓存中传输数据;
缓存任务产生子单元,用于根据每块帧缓存的状态以及条件检测子单元得到的当前达到的状态更新条件,确定每块帧缓存的缓存任务;
状态更新子单元,用于在所述条件检测子单元检测到的数据存储状态达到预设的状态更新条件时,采用该状态更新条件下的状态更新机制,更新每块帧缓存的状态。
进一步的,所述装置还包括:
队列存储单元,用于存储已缓存数据队列和数据占用队列,当所述帧缓存的状态为已经缓存数据状态时,使所述帧缓存进入所述已缓存数据队列,当所述帧缓存的状态为被数据占用状态时,使所述帧缓存进入所述数据占用队列。
进一步的,所述状态更新子单元在一帧数据缓存完毕,并采用处于准备缓存数据状态的帧缓存存储下一帧数据时,将处于正在缓存数据状态的帧缓存的状态更新为已经缓存数据状态,将处于准备缓存数据状态的帧缓存的状态更新为正在缓存数据状态,如果当前不存在处于空闲状态的帧缓存时,按照先进先出的顺序,将最早进入所述已缓存数据队列中帧缓存的状态更新为准备缓存数据状态;
在读取帧缓存时,按照先进先出的顺序,将所述已缓存数据队列中被读取的一块或者多块帧缓存的状态更新为被数据占用状态;
在释放帧缓存时,按照先进先出的顺序,将所述数据占用队列中被释放的一块或者多块帧缓存更新为空闲状态。
进一步的,所述装置还包括:
帧缓存申请单元,用于在一帧数据缓存完毕,且不存在处于空闲状态的帧缓存时,动态申请一块新的帧缓存,同时动态调整内存的存储空间的帧缓存总数。
在本发明实施例中,通过将内存配置为多块帧缓存,设置每块帧缓存的状态,根据每块帧缓存的状态以及预设的状态更新条件下的状态更新机制,确定每块帧缓存的缓存任务,并更新每块帧缓存的状态,从而在一帧数据帧缓存完毕时,切换到另一个帧缓存来接收下一帧数据,避免了具有恒定速度或流量的数据帧被丢失。通过建立两个先进先出队列,从而保证最早输入的数据先被编码程序使用,使数据保持连续性。由于可以动态的改变帧缓存的个数,在内存容量允许时,可以达到不丢失一帧数据的效果。
附图说明
图1是本发明实施例提供的数据缓存方法的实现流程图;
图2是本发明实施例提供的帧缓存状态更新机制的一个具体示例图;
图3是本发明实施例提供的Ready队列和Output队列的状态轮替的具体示例图;
图4是本发明实施例提供的C→D的状态轮替示意图;
图5是本发明实施例提供的C→D的Ready队列和Output队列的状态轮替示意图;
图6是本发明实施例提供的D→E的状态轮替示意图;
图7是本发明实施例提供的D→E的Ready队列和Output队列的状态轮替示意图;
图8是本发明实施例提供的数据缓存装置的结构示意图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
在本发明实施例中,设置每块帧缓存的状态,所述帧缓存的状态用于标识帧缓存的数据存储状态,根据每块帧缓存的状态以及预设的状态更新条件下的状态更新机制,确定每块帧缓存的缓存任务,并更新每块帧缓存的状态,从而在一帧数据帧缓存完毕时,即可快速的切换到另一个帧缓存来接收下一帧数据,避免了具有恒定速度或流量的数据帧被丢失。
图1示出了本发明实施例提供的内存的数据缓存方法的实现流程,详述如下:
在步骤S101中,将内存的存储空间配置为N块帧缓存,并设置每块帧缓存的状态,帧缓存的状态用于标识帧缓存的数据存储状态。
在将内存的存储空间配置为N块帧缓存时,将每块帧缓存的大小配置为一帧数据大小,并为每块帧缓存配置一标号,如Buffer_1,Buffer_2,Buffer_3,......,Buffer_n,以区分每块帧缓存。其中N为大于3的自然数。
在N块帧缓存中缓存数据时,设置5种帧缓存的状态,用于标识帧缓存的数据存储状态。其中5种帧缓存的状态分别为正在缓存数据状态(也称为Getting状态)、准备缓存数据状态(也称为Preparing状态)、已经缓存数据状态(也称为Ready状态)、被数据占用状态(也称为Output状态)、以及空闲状态(也称为Null状态)。其中Getting状态是指帧缓存正在缓存数据;Preparing状态是指帧缓存准备缓存数据;Ready状态是指帧缓存已经缓存数据,可以提供给编码程序使用;Output状态是指帧缓存已经被数据占用,暂时不能用来缓存数据;Null状态是指帧缓存处于无可用数据的空闲状态,可以用来缓存数据。
在开始缓存数据前,为每块帧缓存设置初始状态,其中设置至少一块帧缓存的状态为Preparing状态,其余帧缓存可以均设置为Null状态。如可以设置Buffer_1的状态为Preparing状态,Buffer_2、Buffer_3、Buffer_4、Buffer_5的状态均为Null状态。
在步骤S102中,在当前帧数据缓存完毕前,根据每块帧缓存的状态确定用于缓存下一帧数据的帧缓存,并根据每块帧缓存的状态以及预设的状态更新条件下的状态更新机制,更新每块帧缓存的状态。
在本发明实施例中,采用直接存储器存取方式(Direct Memory Access,DMA)将源地址中的数据传输至目的地址中,其中目的地址即为本发明实施例中的内存的相应地址。当帧缓存的数据存储状态达到预设的更新条件时,如一帧数据(如处于Getting状态的A帧)缓存完毕时,根据每块帧缓存的状态切换到另一块帧缓存来存储下一帧数据,即马上向处于Preparing状态的帧缓存中(如Buffer_1中)传输B帧数据,同时产生DMA中断,DMA中断处理函数根据每块帧缓存的状态,确定每块帧缓存的缓存任务,并根据预设的状态更新条件下的状态更新机制,更新每块帧缓存的状态。
其中确定每块帧缓存的缓存任务包括DMA的目的地址和源地址,以及传输长度。其中DMA的目的地址的确定过程如下:中断处理函数从所有帧缓存中寻找处于Null状态的帧缓存,如果处于Null状态的帧缓存的数量大于1,则从中任意选择一块帧缓存(如Buffer_2)作为DMA的目的地址。
在本发明另一实施例中,如果当前不存在处于Null状态的帧缓存,则中断处理函数从所有帧缓存中寻找处于Ready状态的帧缓存,如果处于Ready状态的帧缓存的数量大于1,则从中任意选择一块帧缓存作为DMA的目的地址。
在本发明另一实施例中,可以预先创建一先进先出(First In First Out,FIFO)队列,用于管理处于Ready状态的帧缓存,在此称为已缓存数据队列(Ready队列)。该Ready队列的最大容量为N-2,其中N为配置的帧缓存的块数。如果当前不存在处于Null状态的帧缓存,则中断处理函数按照先进先出的顺序从该Ready队列中选择一块帧缓存作为DMA的目的地址。
在本发明另一实施例中,为了避免数据帧的丢失,确定下一数据帧的缓存任务时,如果当前不存在处于Null状态的帧缓存,则动态申请一块新的帧缓存,并将该新的帧缓存作为DMA的目的地址。同时动态调整内存的存储空间的帧缓存总数,即由原来的N调整为N+1,此时Ready队列和Output队列的容量也随着增加。
在本发明实施例中,预设的状态更新条件包括一帧数据缓存完毕、读取帧缓存、以及释放帧缓存。其中一帧数据缓存完毕是指N块帧缓存中处于Getting状态的帧缓存中数据缓存完毕;读取帧缓存是指编码程序从处于Ready状态的帧缓存中读取数据;释放帧缓存是指编码程序使用完处于Output状态的帧缓存中的数据。状态更新条件包括一帧数据缓存完毕、读取帧缓存、以及释放帧缓存。
而在上述预设的状态更新条件下的状态更新机制如下所述:
在当前帧数据缓存完毕时,将下一帧数据传输至处于准备缓存数据状态的帧缓存,并采用处于空闲状态的其中一块帧缓存存储再下一帧数据,同时将处于Getting状态的帧缓存的状态更新为Ready状态,将处于Preparing状态的帧缓存的状态更新为Getting状态,将处于Null状态的其中一块帧缓存的状态更新为Preparing状态。
在本发明另一实施例中,在当前帧数据缓存完毕时,如果不存在处于Null状态的帧缓存,则将处于Ready状态的其中一块帧缓存的状态更新为Preparing状态。
在本发明另一实施例中,在当前帧数据缓存完毕时,如果不存在处于Null状态的帧缓存,则按照先进先出的顺序从Ready队列中确定一块帧缓存,并将该帧缓存的状态更新为Preparing状态。
为了避免数据帧的丢失,在本发明另一实施例中,在当前帧数据缓存完毕时,如果不存在处于Null状态的帧缓存,则动态申请一块新的帧缓存,并将该新的帧缓存的状态设置为Preparing状态。同时动态调整内存的存储空间的帧缓存总数,即由原来的N调整为N+1,此时Ready队列和Output队列的容量也随着增加。
当读取帧缓存时,将读取的帧缓存的状态更新为Output状态。
在本发明实施例中,由于只有在帧缓存已经缓存完数据,即帧缓存处于Ready状态时,编码程序才能从该帧缓存中读取到有效数据,而编码程序在处于Ready状态的帧缓存中读取数据时,是按照先进先出的顺序读取的,因此,将编码程序取走数据的帧缓存的状态更新为Output状态的过程,即是将最先进入Ready队列中的处于Ready状态的帧缓存的状态更新为Output状态。
在本发明另一实施例中,当Ready队列中帧缓存的数量大于1时,如果编码程序需要同时使用多块帧缓存中的数据,则可以按照先进先出的顺序一次从Ready队列中读取多个帧缓存中的数据,从而使编码程序可以同时使用原始帧和参考帧,从而提高了编码效率。此时,将编码程序读取数据的所有帧缓存的状态更新为Output状态。从而使编码程序可以同时使用多块帧缓存中的数据,提高了编码效率。
在本发明实施例中,由于数据缓存完毕后的帧缓存即可直接提供给编码程序使用,从而避免了内存拷贝。
当释放帧缓存时,将被释放的帧缓存的状态更新为Null状态。
在本发明实施例中,可以预先创建一FIFO队列,用于管理处于Output状态的帧缓存,在此称为数据占用队列(Output队列)。该Output队列的最大容量为N-3,其中N为配置的帧缓存的块数,且任意时刻,Ready队列和Output队列中的帧缓存的数量之和小于或者等于N-2,其中N为配置的帧缓存的块数。由于只有在编码程序已经读取帧缓存中的数据,即帧缓存处于Output状态时,编码程序才能使用该帧缓存中的数据,因此,在将编码程序使用完其中数据的帧缓存的状态更新为Null状态的过程,即是将最先进入Output队列中的帧缓存的状态更新为Null状态。
在本发明另一实施例中,当Output队列中帧缓存的数量大于1时,如果编码程序同时使用完多块帧缓存,则可以按照先进先出的顺序同时从Output队列中释放多个帧缓存,此时,将编码程序释放的所有帧缓存的状态从Output状态更新为Null状态。
图2示出了本发明实施例提供的帧缓存状态更新机制的一个具体示例,详述如下:
在此假设将内存配置为5块帧缓存,分别为Buffer_1、Buffer_2、Buffer_3、Buffer_4、Buffer_5,并假设在开始缓存数据后的某个时刻A,5块帧缓存的状态如图2中的A所示,此时,Ready队列和Output队列的状态如图3中的A所示。以下循着图2和图3所示的A→B→C→D→E这几个时刻的状态变更来详细说明在状态更新条件下的缓存机制。
(1)A→B
请参阅图2,Buffer_1数据缓存完毕,此时,DMA继续向处于Preparing状态的Buffer_2传输数据,并根据每块帧缓存的状态,确定下一数据帧的缓存任务,同时根据状态更新条件下的状态更新机制,更新每块帧缓存的状态,其具体过程为:产生DMA中断,中断处理函数查询处于Null状态下的帧缓存(此处为Buffer_3),将Buffer_3作为下一数据帧的目的地址,同时中断处理函数根据新的一帧数据缓存完毕条件下的状态更新机制,将处于Getting状态的Buffer_1的状态更新为Ready状态,将处于Preparing状态的Buffer_2的状态更新为Getting状态,将处于Null状态的Buffer_3的状态更新为Preparing状态,从而实现图2所示的A→B的状态轮替。
请参阅图3,由于Buffer_1的状态由Getting状态更新为Ready状态,因此,使Buffer_1进入Ready队列,从而实现图3所示的A→B的Ready队列和Output队列的状态轮替。
(2)B→C
请参阅图2,读取帧缓存,即编码程序需要读取一帧数据,此时,编码程序按照先进先出的顺序从Ready队列中读取一帧(即Buffer_4中的数据),此时,根据读取帧缓存条件下的状态更新机制,将处于Ready状态的Buffer_4的状态更新为Output状态,从而实现图2所示的B→C的状态轮替。
请参阅图3,由于Buffer_4的状态由Ready状态更新为Output状态,因此,将Buffer_4从Ready队列中取出,并使Buffer_4进入Output队列,从而实现图3所示的B→C的Ready队列和Output队列的状态轮替。
(3)C→D
C→D的状态轮替主要包括两个步骤:
步骤1:请参阅图4,读取帧缓存,即编码程序需要读取一帧数据,此时,编码程序按照先进先出的顺序从Ready队列中读取一帧(即Buffer_5中的数据),此时,根据读取帧缓存条件下的状态更新机制,将处于Ready状态的Buffer_5的状态更新为Output状态,从而实现图4所示的C→C’的状态轮替。
请参与图5,由于Buffer_5的状态由Ready状态更新为Output状态,因此,将Buffer_5从Ready队列中删除,并使Buffer_5进入Output队列,从而实现图5所示的C→C’的Ready队列和Output队列的状态轮替。
步骤2:请参阅图4,Buffer_2数据缓存完毕,此时,DMA继续向处于Preparing状态的Buffer_3传输数据,并根据每块帧缓存的状态,确定下一数据帧的缓存任务,同时根据状态更新条件下的状态更新机制,更新每块帧缓存的状态,其具体过程为:产生DMA中断,中断处理函数查询5块帧缓存中是否存在处于Null状态的帧缓存,由于不存在,此时,按照先进先出的顺序从Ready队列中选择最早进入Ready队列的帧缓存(此处为Buffer_1),将Buffer_1作为下一数据帧的缓存任务的目的地址。同时中断处理函数根据新的一帧数据缓存完毕条件下的状态更新机制,将处于Ready状态的Buffer_1的状态更新为Preparing状态,将处于Getting状态的Buffer_2的状态更新为Ready状态,将处于Preparing状态的Buffer_3的状态更新为Getting状态,从而实现图4所示的C’→D的状态轮替。经步骤1和步骤2之后,即可实现图2所示的C→D的状态轮替。
请参阅图5,由于Buffer_1的状态由Ready状态更新为Preparing状态,因此,将Buffer_1从Ready队列中删除;由于Buffer_2的状态由Getting状态更新为Ready状态,因此,使Buffer_2进入Ready队列,从而实现图5所示的C’→D的Ready队列和Output队列的状态轮替。经步骤1和步骤2之后,即可实现图3所示的C→D的Ready队列和Output队列的状态轮替。
(4)D→E
D→E的状态轮替主要包括两个步骤:
步骤1:请参阅图6,Buffer_1数据缓存完毕,此时,DMA继续向处于Preparing状态的Buffer_1传输数据,并根据每块帧缓存的状态,确定下一数据帧的缓存任务,同时根据状态更新条件下的状态更新机制,更新每块帧缓存的状态,其具体过程为:产生DMA中断,中断处理函数查询5块帧缓存中是否存在处于Null状态的帧缓存,由于不存在,此时,按照先进先出的顺序从Ready队列中选择最早进入Ready队列的帧缓存(此处为Buffer_2),将Buffer_2作为下一数据帧的缓存任务的目的地址。同时中断处理函数根据数据缓存完毕条件下的状态更新机制,将处于Ready状态的Buffer_2的状态更新为Preparing状态,将处于Getting状态的Buffer_3的状态更新为Ready状态,将处于Preparing状态的Buffer_1的状态更新为Getting状态,从而实现图6所示的D→D’的状态轮替。
请参阅图7,由于Buffer_2的状态由Ready状态更新为Preparing状态,因此,将Buffer_2从Ready队列中删除;由于Buffer_3的状态由Getting状态更新为Ready状态,因此,使Buffer_3进入Ready队列,从而实现图7所示的D→D’的Ready队列和Output队列的状态轮替。
步骤2:请参阅图6,编码程序按照先入先出的顺序释放Buffer_4,此时,根据释放帧缓存的条件下的状态更新机制,将处于Output状态的Buffer_4的状态更新为Null状态,从而实现图6所示的D’→E的状态轮替。经步骤1和步骤2后,即可实现图2所示的D→E的状态轮替。
请参阅图7,由于Buffer_4的状态由Output状态更新为Null状态,因此,将Buffer_4从Output队列中删除,从而实现图7所示的D’→E的Ready队列和Output队列的状态轮替。经步骤1和步骤2后,即可实现图3所示的D→E的Ready队列和Output队列的状态轮替。
图8示出了本发明实施例提供的内存的数据缓存装置的结构,为了便于说明,仅示出了与本发明实施例相关的部分。该数据缓存装置可以是内置于数据缓存设备中的软件单元、硬件单元或者软硬件相结合的单元,也可以作为独立的挂件集成到数据缓存设备中或者运行于数据缓存设备的应用系统中。该内存的存储空间被配置为多块帧缓存,其中:
帧缓存配置单元81设置内存中预设的每块帧缓存的状态,帧缓存的状态用于标识帧缓存的数据存储状态。在将内存的存储空间配置为N块帧缓存时,将每块帧缓存的大小配置为一帧数据大小,并为每块帧缓存配置一标号;如Buffer_1,Buffer_2,Buffer_3,......,Buffer_n,以区分每块帧缓存。其中N为大于等于2的自然数。帧缓存的状态包括Getting状态、Preparing状态、Ready状态、Output状态、以及Null状态。帧缓存各状态的所表示的数据存储状态如上所述,在此不再赘述。
数据缓存单元82在当前帧数据缓存完毕前,根据每块帧缓存的状态确定用于缓存下一帧数据的帧缓存,并根据每块帧缓存的状态以及预设的状态更新条件下的状态更新机制,更新每块帧缓存的状态。该数据缓存单元82包括条件检测子单元821,数据传输子单元822,缓存任务产生子单元823,以及状态更新子单元824。
条件检测子单元821实时检测数据存储状态是否达到预设的状态更新条件。其中预设的状态更新条件包括一帧数据缓存完毕、读取帧缓存、以及释放帧缓存。
数据传输子单元822在条件检测子单元821检测到数据存储状态达到一帧数据缓存完毕的状态更新条件时,向处于Preparing状态的帧缓存中传输数据。
缓存任务产生子单元823在当前帧数据缓存完毕前,根据每块帧缓存的状态确定用于缓存下一帧数据的帧缓存。其中确定用于缓存下一帧数据的帧缓存包括DMA的目的地址和源地址、以及传输长度。缓存任务产生子单元823确定DMA的目的地址的过程如下:从所有帧缓存中寻找处于Null状态的帧缓存,如果处于Null状态的帧缓存的数量大于1,则从中任意选择一块帧缓存(如Buffer_2)DMA的目的地址。
在本发明另一实施例中,如果当前不存在处于Null状态的帧缓存,则缓存任务产生子单元823从所有帧缓存中寻找处于Ready状态的帧缓存,如果处于Ready状态的帧缓存的数量大于1,则从中任意选择一块帧缓存作为DMA的目的地址。
在本发明另一实施例中,该数据缓存装置还包括队列存储单元83。该队列存储单元83预先建立两个先进先出队列,分别为Ready队列和Output队列。其中用于管理处于Ready状态的帧缓存,其最大容量为N-2,N为配置的帧缓存的块数。Output队列用于管理处于Output状态的帧缓存,其最大容量为N-3,N为配置的帧缓存的块数,且任意时刻,Ready队列和Output队列中的帧缓存的数量之和小于或者等于N-2。此时,如果当前不存在处于Null状态的帧缓存,则缓存任务产生子单元823按照先进先出的顺序从队列存储单元83的Ready队列中选择一块帧缓存作为DMA的目的地址。
为了避免数据帧的丢失,在本发明另一实施例中,该数据缓存装置还包括帧缓存申请单元,如果当前不存在处于Null状态的帧缓存,则帧缓存申请单元动态申请一块新的帧缓存,并动态调整内存的存储空间的帧缓存总数。此时缓存任务产生子单元823将帧缓存申请单元申请的帧缓存作为DMA的目的地址。
状态更新子单元824在条件检测子单元821检测到数据存储状态达到预设的状态更新条件时,采用该状态更新条件下的状态更新机制,更新每块帧缓存的状态。
当一帧数据缓存完毕时,将处于Getting状态的帧缓存的状态更新为Ready状态,将处于Preparing状态的帧缓存的状态更新为Getting状态,将处于Null状态的其中一块帧缓存的状态更新为Preparing状态。
在本发明另一实施例中,当一帧数据缓存完毕时,如果不存在处于Null状态的帧缓存,则状态更新子单元824将处于Ready状态的其中一块帧缓存的状态更新为Preparing状态。
在本发明另一实施例中,当一帧数据缓存完毕时,如果不存在处于Null状态的帧缓存,则状态更新子单元824按照先进先出的顺序从队列存储单元83中的Ready队列中确定一块帧缓存,并将该帧缓存的状态更新为Preparing状态。
为了避免数据帧的丢失,在本发明另一实施例中,在新的一帧数据缓存完毕条件下,如果不存在处于Null状态的帧缓存,则状态更新子单元824将帧缓存申请单元申请的帧缓存的状态设为Preparing状态。
在读取帧缓存时,将被读取的帧缓存的状态更新为Output状态。在本发明实施例中,由于只有在帧缓存已经缓存数据,即帧缓存处于Ready状态时,才能从该帧缓存中读取到有效数据,而在读取帧缓存时,是按照先进先出的顺序读取的,因此,将被读取的帧缓存的状态更新为Output状态的过程,即是将最先进入Ready队列中的帧缓存的状态更新为Output状态。
在本发明另一实施例中,当Ready队列中帧缓存的数量大于1时,如果编码程序需要同时使用多块帧缓存中的数据,则可以按照先进先出的顺序一次从Ready队列中读取多个帧缓存中的数据,此时,将被读取的所有帧缓存的状态更新为Output状态。从而使编码程序可以同时使用多块帧缓存中的数据,提高了编码效率。
在释放帧缓存时,将被释放的帧缓存的状态更新为Null状态。
由于只有在编码程序已经读取帧缓存中的数据,即帧缓存处于Output状态时,编码程序才能使用该帧缓存中的数据,同时为了保证数据帧的连续性,在本发明实施例中,在将被释放的帧缓存的状态更新为Null状态时,按照先进先出的顺序将最先进入Output队列中的帧缓存的状态更新为Null状态。
在本发明另一实施例中,当Output队列中帧缓存的数量大于1时,如果编码程序同时使用完多块帧缓存,则可以按照先进先出的顺序同时从Output队列中释放多个帧缓存,此时,将被释放的所有帧缓存的状态从Output状态更新为Null状态。
在本发明实施例中,通过将内存配置为N块帧缓存,并为每块帧缓存设置标识数据存储情况的状态,并根据每块帧缓存的状态以及预设的状态更新条件下的状态更新机制,确定每块帧缓存的缓存任务,并更新每块帧缓存的状态,从而在当前数据帧存储完毕时,即可快速的切换到另一个帧缓存来接收下一帧数据;通过建立两个先进先出队列,从而保证最早输入的数据先被编码程序使用,使数据保持连续性;由于Ready队列的容量可以在1块帧缓存至N-2块帧缓存之间动态变动,从而在一定程度上起到了平衡输入数据的速度和编码速度的作用;当每块帧缓存均缓存数据且编码程序未释放帧缓存时,将最早缓存数据的帧缓存释放,从而可以重新缓存数据;由于两个先进先出队列的容量均可以大于1,从而可以一次为编码程序提供多个帧缓存的数据,有效的提高了编码速度;同时由于可以动态的改变帧缓存的个数,在内存容量允许时,可以达到不丢失一帧数据的效果。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
Claims (12)
1.一种内存的数据缓存方法,所述内存的存储空间被配置为多块帧缓存,其特征在于,所述方法包括下述步骤:
A、设置每块帧缓存的状态,所述帧缓存的状态用于标识帧缓存的数据存储状态,所述帧缓存的状态包括正在缓存数据状态、准备缓存数据状态、已经缓存数据状态、被数据占用状态、以及空闲状态;
B、在当前帧数据缓存完毕前,根据每块帧缓存的状态确定用于缓存下一帧数据的帧缓存,并根据每块帧缓存的状态以及预设的状态更新条件下的状态更新机制,更新每块帧缓存的状态,所述状态更新条件包括一帧数据缓存完毕、读取帧缓存、以及释放帧缓存。
2.如权利要求1所述的方法,其特征在于,所述步骤B具体包括:
B1、实时检测数据存储状态是否达到预设的状态更新条件;
B2、在当前帧数据缓存完毕时,将下一帧数据传输至处于准备缓存数据状态的帧缓存,并准备处于空闲状态的其中一块帧缓存以用来存储再下一帧数据,同时将处于正在缓存数据状态的帧缓存的状态更新为已经缓存数据状态,将处于准备缓存数据状态的帧缓存的状态更新为正在缓存数据状态,将处于空闲状态的其中一块帧缓存的状态更新为准备缓存数据状态;
B3、当读取帧缓存时,将读取的帧缓存的状态更新为被数据占用状态;
B4、当释放帧缓存时,将被释放的帧缓存的状态更新为空闲状态。
3.如权利要求2所述的方法,其特征在于,所述方法还包括下述步骤:
设置先进先出的已缓存数据队列和数据占用队列,当所述帧缓存的状态为已经缓存数据状态时,使所述帧缓存进入所述已缓存数据队列,当所述帧缓存的状态为被数据占用状态时,使所述帧缓存进入所述数据占用队列。
4.如权利要求3所述的方法,其特征在于,所述已缓存数据队列的最大容量为内存中预设的帧缓存总数减2,所述数据占用队列的最大容量为内存中预设的帧缓存总数减3,所述已缓存数据队列中的帧缓存块数与数据占用队列中的帧缓存块数之和小于或者等于内存中预设的帧缓存总数减2。
5.如权利要求3所述的方法,其特征在于,所述步骤B2具体包括B2’、如果当前帧数据缓存完毕,将下一帧数据传输至处于准备缓存数据状态的帧缓存,并准备处于空闲状态的其中一块帧缓存以用来存储再下一帧数据,同时将处于正在缓存数据状态的帧缓存的状态更新为已经缓存数据状态,将处于准备缓存数据状态的帧缓存的状态更新为正在缓存数据状态,如果当前不存在处于空闲状态的帧缓存,按照先进先出的顺序,将最早进入所述已缓存数据队列中帧缓存的状态更新为准备缓存数据状态,或者动态申请一块新的帧缓存,并将所述新的帧缓存的状态设为准备缓存数据状态,同时动态调整内存的存储空间的帧缓存总数;
所述步骤B3具体包括B3’、当读取帧缓存时,按照先进先出的顺序,将所述已缓存数据队列中的被读取的一块或者多块帧缓存的状态更新为被数据占用状态;
所述步骤B4具体包括B4’、当释放帧缓存时,按照先进先出的顺序,将所述数据占用队列中被释放的一块或者多块帧缓存的状态更新为空闲状态。
6.一种内存的数据缓存装置,所述内存的存储空间被配置为多块帧缓存,其特征在于,所述装置包括:
帧缓存配置单元,用于设置每块帧缓存的状态,所述帧缓存的状态用于标识帧缓存的数据存储状态,所述帧缓存的状态包括正在缓存数据状态、准备缓存数据状态、已经缓存数据状态、被数据占用状态、以及空闲状态;
数据缓存单元,用于在当前帧数据缓存完毕前,根据每块帧缓存的状态确定用于缓存下一帧数据的帧缓存,并根据每块帧缓存的状态以及预设的状态更新条件下的状态更新机制,更新每块帧缓存的状态,所述状态更新条件包括一帧数据缓存完毕、读取帧缓存、以及释放帧缓存。
7.如权利要求6所述的装置,其特征在于,所述数据缓存单元包括:
条件检测子单元,用于实时检测数据存储状态是否达到预设的状态更新条件;
数据传输子单元,用于在所述条件检测子单元检测到数据存储状态达到一帧数据缓存完毕的状态更新条件时,向处于准备缓存数据状态的帧缓存中传输数据;
缓存任务产生子单元,用于在当前帧数据缓存完毕前,根据每块帧缓存的状态确定用于缓存下一帧数据的帧缓存;
状态更新子单元,用于在所述条件检测子单元检测到数据存储状态达到预设的状态更新条件时,采用所述状态更新条件下的状态更新机制,更新每块帧缓存的状态。
8.如权利要求7所述的装置,其特征在于,所述状态更新子单元在一帧数据缓存完毕时,将处于正在缓存数据状态的帧缓存的状态更新为已经缓存数据状态,将处于准备缓存数据状态的帧缓存的状态更新为正在缓存数据状态,将处于空闲状态的其中一块帧缓存的状态更新为准备缓存数据状态;
在读取帧缓存时,将被读取的帧缓存的状态更新为被数据占用状态;
在释放帧缓存时,将被释放的帧缓存的状态更新为空闲状态。
9.如权利要求7所述的装置,其特征在于,所述装置还包括:
队列存储单元,用于存储已缓存数据队列和数据占用队列,当所述帧缓存的状态为已经缓存数据状态时,使所述帧缓存进入所述已缓存数据队列,当所述帧缓存的状态为被数据占用状态时,使所述帧缓存进入所述数据占用队列。
10.如权利要求9所述的装置,其特征在于,所述已缓存数据队列的最大容量为内存中预设的帧缓存总数减2,所述数据占用队列的最大容量为内存中预设的帧缓存总数减3,所述已缓存数据队列中的帧缓存块数与数据占用队列中的帧缓存块数之和小于或者等于内存中预设的帧缓存总数减2。
11.如权利要求9所述的装置,其特征在于,所述状态更新子单元在一帧数据缓存完毕,并采用处于准备缓存数据状态的帧缓存存储下一帧数据时,将处于正在缓存数据状态的帧缓存的状态更新为已经缓存数据状态,将处于准备缓存数据状态的帧缓存的状态更新为正在缓存数据状态,如果当前不存在处于空闲状态的帧缓存时,按照先进先出的顺序,将最早进入所述已缓存数据队列中帧缓存的状态更新为准备缓存数据状态;
在读取帧缓存时,按照先进先出的顺序,将所述已缓存数据队列中被读取的一块或者多块帧缓存的状态更新为被数据占用状态;
在释放帧缓存时,按照先进先出的顺序,将所述数据占用队列中被释放的一块或者多块帧缓存更新为空闲状态。
12.如权利要求9所述的装置,其特征在于,所述装置还包括:
帧缓存申请单元,用于在一帧数据缓存完毕,且不存在处于空闲状态的帧缓存时,动态申请一块新的帧缓存,同时动态调整内存的存储空间的帧缓存总数。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2009101069234A CN101567849B (zh) | 2009-04-30 | 2009-04-30 | 一种数据缓存方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2009101069234A CN101567849B (zh) | 2009-04-30 | 2009-04-30 | 一种数据缓存方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101567849A CN101567849A (zh) | 2009-10-28 |
CN101567849B true CN101567849B (zh) | 2011-09-21 |
Family
ID=41283807
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2009101069234A Expired - Fee Related CN101567849B (zh) | 2009-04-30 | 2009-04-30 | 一种数据缓存方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101567849B (zh) |
Families Citing this family (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102402409B (zh) * | 2010-09-07 | 2016-06-01 | 无锡中感微电子股份有限公司 | 一种刷屏方法和装置 |
CN102402968B (zh) * | 2010-09-07 | 2016-02-10 | 无锡中感微电子股份有限公司 | 一种根据预设帧率进行刷屏的方法和装置 |
CN103324491A (zh) * | 2012-03-20 | 2013-09-25 | 腾讯科技(深圳)有限公司 | 加载数据的方法和装置 |
CN103680461B (zh) * | 2012-09-20 | 2017-06-23 | 广东新岸线计算机系统芯片有限公司 | 一种实现显示帧缓存切换的方法及显示系统 |
CN103596037B (zh) * | 2013-11-19 | 2016-09-28 | 天津市亚安科技有限公司 | 一种实时视频流缓冲的控制方法 |
CN104683831A (zh) * | 2013-12-02 | 2015-06-03 | 青岛永通电梯工程有限公司 | 一种视频播放装置 |
CN104090795B (zh) * | 2014-07-08 | 2017-05-24 | 三星电子(中国)研发中心 | 实现多核移动终端升级的方法、系统及装置 |
CN104503928A (zh) * | 2014-12-05 | 2015-04-08 | 中国航空工业集团公司第六三一研究所 | 一种基于队列管理的可随机存储电路 |
CN104660585B (zh) * | 2014-12-30 | 2018-03-13 | 赖洪昌 | 无缝衔接的内核数据包捕获技术 |
CN106488240A (zh) * | 2015-09-01 | 2017-03-08 | 晨星半导体股份有限公司 | 影像处理系统及影像处理方法 |
WO2018103022A1 (zh) * | 2016-12-07 | 2018-06-14 | 深圳前海达闼云端智能科技有限公司 | 帧缓存实现方法、装置、电子设备和计算机程序产品 |
CN108632624B (zh) * | 2017-12-18 | 2020-10-30 | 百富计算机技术(深圳)有限公司 | 图像数据处理方法、装置、终端设备及可读存储介质 |
CN111479355B (zh) * | 2020-04-17 | 2021-08-13 | 深圳爱克莱特科技股份有限公司 | 一种用于led播放系统的三缓存的帧保护方法及系统 |
CN115802095B (zh) * | 2023-01-06 | 2023-04-18 | 北京象帝先计算技术有限公司 | 视频流传输装置、系统、设备及视频流传输方法 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1627271A (zh) * | 2003-12-10 | 2005-06-15 | 三星电子株式会社 | 闪速存储器和闪速存储器的映射控制设备和方法 |
CN101162608A (zh) * | 2006-10-10 | 2008-04-16 | 北京华旗资讯数码科技有限公司 | 闪存的存储块的标识方法 |
-
2009
- 2009-04-30 CN CN2009101069234A patent/CN101567849B/zh not_active Expired - Fee Related
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1627271A (zh) * | 2003-12-10 | 2005-06-15 | 三星电子株式会社 | 闪速存储器和闪速存储器的映射控制设备和方法 |
CN101162608A (zh) * | 2006-10-10 | 2008-04-16 | 北京华旗资讯数码科技有限公司 | 闪存的存储块的标识方法 |
Non-Patent Citations (1)
Title |
---|
JP特开2008-198102A 2008.08.28 |
Also Published As
Publication number | Publication date |
---|---|
CN101567849A (zh) | 2009-10-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101567849B (zh) | 一种数据缓存方法和装置 | |
CN110312156B (zh) | 一种视频缓存方法、装置及可读存储介质 | |
US5502833A (en) | System and method for management of a predictive split cache for supporting FIFO queues | |
US7395385B2 (en) | Memory management for a mobile multimedia processor | |
US7571216B1 (en) | Network device/CPU interface scheme | |
CN100440184C (zh) | 一种能同时进行读写操作的dma控制器及传输方法 | |
CN111126589B (zh) | 神经网络数据处理装置、方法和电子设备 | |
US20070297433A1 (en) | Method and apparatus for double buffering | |
US8356299B2 (en) | Interrupt processing method and system | |
CN101877666B (zh) | 基于零拷贝方式的多应用程序报文接收方法和装置 | |
US20070258362A1 (en) | Data flow control apparatus and method of mobile terminal for reverse communication from high speed communication device to wireless network | |
CN113468097A (zh) | 基于片上系统的数据交换方法 | |
TW201319819A (zh) | 使用資料傳輸率節流來執行序列ata連接的資料傳輸之方法、電腦可讀媒體和計算裝置 | |
US20020081098A1 (en) | Compressed-data processing arrangement and related method | |
CN103838694B (zh) | 一种fpga高速读取usb接口数据的方法 | |
EP1971923B1 (en) | Method for managing under-runs and a device having under-run management capabilities | |
US8589632B1 (en) | Arbitration method for programmable multiple clock domain bi-directional interface | |
JP2000069430A (ja) | ビデオサーバ装置およびそのデータ転送制御方法 | |
US20030223447A1 (en) | Method and system to synchronize a multi-level memory | |
US9892088B2 (en) | Data processing system and method of controlling access to a shared memory unit | |
US7239640B1 (en) | Method and apparatus for controlling ATM streams | |
KR101706201B1 (ko) | 다이렉트 메모리 액세스 컨트롤러 및 그것의 동작 방법 | |
CN102290050B (zh) | 一种传输音频数据的方法及装置 | |
CN117331689A (zh) | 数据处理方法、网卡及计算设备 | |
CN108616329B (zh) | 一种基于数字电路的fc网络序列发送控制系统及方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20110921 Termination date: 20180430 |