一种用环形数据缓冲区读写批量数据的方法及装置的制作方法

文档序号:6443494阅读:260来源:国知局
专利名称:一种用环形数据缓冲区读写批量数据的方法及装置的制作方法
技术领域
本发明涉及图像数据处理领域,尤其涉及的是一种用环形数据缓冲区读写批量数据的方法及装置。
背景技术
在图像处理中,经常会需要采集批量数据或者及显示多幅图像的,保证数据的完整性是图像处理的基本要求,因此,在图像处理过程中数据的传输与通信就是关键。通常,数据都是从外设数据缓冲到终端设备的内存后再进行处理的,然而不论是个人电脑(PC)还是其它嵌入式设备终端,内存总是有限的,一次性地申请一个内存来缓冲这些数据是比较困难的,所以就需要使用环形数据缓冲区的数据结构来解决这一难题。环形缓冲区是一个先进先出的循环缓冲区,通常有一个读指针和一个写指针,程序中通过移动读指针和写指针就可以实现缓冲区的数据读取和写入,由于有时读指针与写指针是同时使用的,所以会使得缓冲区产生互斥问题,这会影响到数据传输的准确性及数据传输的效率。

发明内容
本发明要解决的技术问题在于,针对现有技术的上述缺陷,提供一种用环形数据缓冲区读写批量数据的方法及装置,使用环形缓冲区与队列控制相结合的方法来解决图像处理过程中在缓冲区产生读取数据与写入数据互斥的问题。本发明解决技术问题所采用的技术方案如下
一种用环形数据缓冲区读写批量数据的方法,包括步骤
A、当有数据写请求时,写指针计算出在环形数据缓冲区当前要写入数据的起始位置, 读取外设数据,从该起始位置开始向所述环形缓冲区写入数据,写完后所述写指针的数值加I ;
B、当收到读数据请求时,读指针计算当前需要读取的数据所在的位置,从该位置开始读取数据,读完后所述读指针的数值加I ;
C、当所述环形数据缓冲区出现异常,根据异常类型执行相应的操作,其中,所述异常的类型包括所述环形数据缓冲区溢出或为空。优选地,所述步骤A之前还包括
Al、定义多个缓冲区,其中,所述缓冲区的个数与所述环形数据缓冲区的个数相等;
A2、建立等待列队;
A3、申请至少一个缓冲区作为环形数据缓冲区,所述缓冲区的地址单元是连续的;
A4、初始化所述读指针、写指针的数值,使所述读指针、写指针的数值均为O;
所述步骤B之前还包括
BI、判断是否收到唤醒信号,如果是,则转向步骤B2,否则返回等待唤醒信号;
B2、判断当前的读指针的绝对位置是否小于写指针的绝对位置,如果判断结果为是时,则进入步骤B,否则表示无数据可读,返回所述步骤BI。优选地,所述步骤C具体包括
Cl、当所述写指针的相对位置超出或等于所述读指针的相对位置,并且所述写指针的绝对位置超出所述读指针的绝对位置,则所述环形缓冲区溢出,发出溢出信号,并进入步骤 C3 ;
C2、当所述写指针的相对位置等于所述读指针的相对位置,并且所述写指针的绝对位置与所述读指针的绝对位置相等,则所述环形数据缓冲区为空,则返回所述环形数据缓冲区为空的信号,并进入步骤C4;
C3、调整所述读指针及所述写指针的绝对位置,使得所述写指针超前所述读指针;
C4、读指针进入等待状态。优选地,所述步骤C3之后具体还包括
当所述写指针的绝对位置等于或者超出所述读指针的绝对位置时,并且所述写指针的相对位置与所述读指针的相对位置相等时,分别重新对所述读指针及写指针进行调整,使得所述写指针超前所述读指针。优选地,所述读指针的绝对位置是指所述读指针相对于所述环形数据缓冲区首地址零位置实际所表示的数值;所述写指针的绝对位置是指所述写指针相对于所述环形数据缓冲区首地址零位置实际所表示的数值;
所述读指针的相对位置是指所述读指针当前的位置相对于所述环形数据缓冲区首地址的距离,所述写指针的相对位置是指所述写指针当前的位置相对于所述环形数据缓冲区首地址的距离。本发明还提供一种实现上述方法的装置
一种用环形数据缓冲区读写批量数据的装置,包括
写指针控制单元,当有数据写请求时,用于控制写指针计算出在环形数据缓冲区当前要写入数据的起始位置,读取外设数据,从该起始位置开始向所述环形缓冲区写入数据,写完后所述写指针的数值加I;
读指针控制单元,当收到读数据请求时,用于控制读指针计算当前需要读取的数据所在的位置,从该位置开始读取数据,读完后所述读指针的数值加I;
指针调整单元,当所述环形数据缓冲区出现异常,根据异常类型执行相应的操作,其中,所述异常的类型包括所述环形数据缓冲区溢出或为空。优选地,其还包括
定义单元,用于定义多个缓冲区,其中,所述缓冲区的个数与所述环形数据缓冲区的个数相等;
列队建立单元,用于建立等待列队;
缓冲区申请单元,用于申请至少一个缓冲区作为环形数据缓冲区,所述缓冲区的地址单元是连续的;
初始化单元,用于初始化所述读指针、写指针的数值,使所述读指针、写指针的数值均为O。优选地,所述指针调整单元包括
第一判断模块,用于判断所述读指针是否收到唤醒信号,如果为是,则唤醒所述读指针,接着并判断当前的读指针的绝对位置是否小于写指针的绝对位置;
第二判断模块,用于判断所述环形数据缓冲区是否异常,根据异常类型向调整控制模块发送相对应的所述环形数据缓冲区异常信号,其中,所述异常信号包括所述环形数据缓冲区溢出信号或所述环形数据缓冲区为空信号;
调整控制模块,当接收到所述环形数据缓冲区溢出信号时,用于调整所述读指针及所述写指针的绝对位置,使得所述写指针超前所述读指针;或当接收到所述环形数据缓冲区为空信号时,用于控制所述读指针进入等待状态。优选地,所述第二判断模块还用于再次判断所述写指针的绝对位置是否等于或者超出所述读指针的绝对位置,并且判断所述写指针的相对位置与所述读指针的相对位置是否相等;
所述指针调整单元还用于当所述写指针的绝对位置等于或超出所述读指针的绝对位置时,并且当所述写指针的相对位置等于所述读指针的相对位置时,分别重新对所述读指针及写指针进行调整,使得所述写指针超前所述读指针。优选地,所述读指针的绝对位置是指所述读指针相对于所述环形数据缓冲区首地址零位置实际所表示的数值;所述写指针的绝对位置是指所述写指针相对于所述环形数据缓冲区首地址零位置实际所表示的数值;
所述读指针的相对位置是指所述读指针当前的位置相对于所述环形数据缓冲区首地址的距离,所述写指针的相对位置是指所述写指针当前的位置相对于所述环形数据缓冲区首地址的距离。本发明所提供的用环形数据缓冲区读写批量数据的方法及装置,写进程与读进程分开执行,实时监控环形数据缓冲区的异常,当所述环形数据缓冲区出现异常时,调整读指针及写指针,使得读数据及写数据可以顺利进行,避免了读进程与写进程同时进行时对环形数据缓冲区进行操作而造成的临界资源访问异常的问题,保证了数据传输的效率,进一步提供了数据传输的精确度。


图I是本发明实施例的用环形数据缓冲区读写批量数据的方法流程图。图2是本发明应用实施例的写环形缓冲区的过程流程图。图3是本发明应用实施例的读环形缓冲区的过程流程图。图4是本发明应用实施例的环形数据缓冲区调整过程流程图。图5是本发明实施例的用环形数据缓冲区读写批量数据的装置原理框图。图6是本发明应用实施例的环形缓冲区结构示意图。
具体实施例方式本发明所提供的用环形数据缓冲区读写批量数据的方法及装置,为使本发明的目的、技术方案及优点更加清楚、明确,以下参照附图并举实施例对本发明进一步详细说明。 应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。本发明实施例的一种用环形数据缓冲区读写批量数据的方法,如图I所示,主要包括以下步骤
7步骤S100、当有数据写请求时,写指针计算出在环形数据缓冲区当前要写入数据的起始位置,读取外设数据,从该起始位置开始向所述环形缓冲区写入数据,写完后所述写指针的数值加I。本实施例中,所述数据写请求携带写入数据的数量,可以是指定单位个数据,例如8192个字节的数据。本实施例中,指针的数值最小单位为1,并且该数值都是整数。进一步地,计算所述起始位置时,根据所述写指针的绝对位置与所述环形数据缓冲区的首地址做求和运算,计算出当前需要写入数据的起始位置。其中的计算方法可根据所述环形数据缓冲区的结构而设计,此处对此不作限制。当写完数据时,写指针的数值加I。步骤S200、当收到读数据请求时,读指针计算当前需要读取的数据所在的位置,从该位置开始读取数据,读完后所述读指针的数值加I。本实施例中,进一步地,计算所述起始位置时,根据所述读指针的绝对位置与所述环形数据缓冲区的首地址做求和运算,计算出当前需要读取数据的起始位置。其中的计算方法可根据所述环形数据缓冲区的结构而设计,此处对此同样不作限制。当读取完数据时,读指针的数值加I。步骤S300、当所述环形数据缓冲区出现异常,根据异常结果执行相应的操作,其中,所述异常的体现包括所述环形数据缓冲区溢出。本实施例中,当所述环形数据缓冲区溢出时,则说明读指针与写指针处于异常状态,则需要调整该读指针及写指针。具体地,分别将所述读指针及所述写指针的绝对位置相对于环形缓冲区首地址的长度值取余数,使得所述环形数据缓冲区处于正常状态(即既不溢出也不是为空)。本实施例中,当环形数据缓冲区异常时,则根据异常类型执行相应的操作,保证了数据传输的准确性,提供数据传输的效率。以下将通过一具体的应用实施例对本发明的用环形数据缓冲区读写批量数据的方法做进一步详细的说明
本实用实施例中假设是数据从图像采集外设向嵌入式终端传输,并在终端处理后显示,环形缓冲区的示意图如图6 (假设buffer (缓冲区)个数为8)。如图2所示,本应用实施例主要包括以下步骤
SlO :定义多个缓冲区,其中,所述缓冲区的个数与所述环形数据缓冲区的个数相等; 具体地,所述多个缓冲区可用BUFFER_NUM表示,进一步地,定义例如定义#define BUFFER, NUM 8 或者 const int BUFFER_NUM = 8。接着转到步骤 Sll。Sll、建立等待列队,具体地,启动外设,初始化外设,申明和建立一个读进程等待队列项,初始化其状态为休眠状态,将其加入到等待队列链表。S12、申请至少一个缓冲区作为环形数据缓冲区,具体地,所述缓冲区的地址单元是连续的;
S13、初始化所述读指针、写指针的数值,使所述读指针、写指针的数值(即绝对位置)均为O。具体地,申请固定个数连续地址单元(单元大小根据需要定)作为缓冲区(buffer),定义和初始化读(rPtr)、写(wPtr)指针,使其指向buffer的头部。其中,本实施例中缓冲区个数=BUFFER_NUM,BUFFER_NUM为整数。但是“BUFFER_ NUM个连续地址单元”大小=BUFFER_NUM *每个单元大小,每个单元大小可根据需要定义,比如说8192个字节。本步骤中例如,定义所述读指针为rPtr,所述写指针为wPtr ;并将所述rPtr和 wPtr定义为整数或者指针类型;不管什么类型,在初始化时必须使二者指向buffer的头部(或者首地址)。当将所述rPtr和wPtr定义为整数类型时,在初始化时使rPtr的数值(即绝对位置)=wPtr的数值(即绝对位置)=O ;当将所述rPtr和wPtr定义为指针类型时,在初始化时使读指针rPtr和写指针wPtr指向所述环形缓冲区的首地址。当然运行的过程中,为了保证数据的连续性和准确性,写指针wPtr必须超前于读指针rptr,且读指针rptr不能追上写指针wPtr。需要说明的是,本实施例中,既有读数据,也有写数据的过程,开始的时候,首先进行的是写进程,当写进程进行到一定时候,写进程唤醒等待队列的读数据进程,当写进程及读进程均启动之后,但是读数据与写数据之间没有严格的顺序,此处对此不作限制,下面分别详细说明读数据与写数据的具体过程
写数据的具体过程
S14,判断是否有数据写请求,当判断结果为是时进入步骤S15、当判断结果为否时,转向步骤S16,等待,返回重新判断是否有数据写请求,即等待数据写请求的到来。S15、写指针计算出在环形数据缓冲区当前要写入数据的环形缓冲区的起始位置, 并读取外设数据,从该起始位置开始向所述环形缓冲区写入指定单位个数据,写完指定单位个数据后写指针加I。例如,当有数据到来时,先根据写指针计算出当前要写buffer (缓冲区)的起始位置(currWritePtr),如图6所示的写指针指示的当前写入的起始位置,然后读取外设数据, 从该起始位置开始向buffer (缓冲区)写指定单位个数据如N (N 一般设为I个Buffer的单位长度)个数据,写完后写指针加I。本步骤中,使用环形数据缓冲区首位置(零位置)与写指针wPtr的绝对位置做求和运算,所述求和运算不是数学上简单的加,这与缓冲区buffer的数据结构有关系,缓冲区 buffer数据结构不一样,算法也不一样,此处对此不作限制。本实施例中,所述读指针或写指针的数值(即绝对位置)是读或写指针当前的位置相对于所述环形数据缓冲区首地址(零位置)实际所表示的数值,其大小不定(可能会随着写入或读取次数一直增加);所述相对位置是读或写指针当前的位置相对于所述环形数据缓冲区首地址的距离,其大小不会超过缓冲区的长度。另外,零地址也就是首地址。读数据的具体过程(如图3所示)
D40、判断是否收到唤醒信号,如果为是,则转向步骤D41,否则转向步骤D43,返回等待唤醒信号。本实施例中,当没有数据可读的时候,读指针处于等待列队之中,等待写指针写进程的唤醒信号后才能读取数据。D41、判断当前的读指针的绝对位置是否小于写指针的绝对位置,如果判断结果为是时,则进入步骤D42,否则表示无数据可读,返回所述步骤D40。D42、读指针接收读数据请求,计算当前需要读取的数据所在的位置,从该位置开始读取数据,读完后所述读指针的数值加I ;其中,当有数据到来时,读指针计算出当前要读buffer (缓冲区)的起始位置(currReadPtr),如图6所示的读指针指示的当前读取的起始位置,然后读取外设数据,从该起始位置开始向buffer (缓冲区)读指定单位个数据如N (N —般设为I个Buffer的单位长度)个数据,读完后写指针加I。具体地,利用读指针的数值与buffer的首地址做求和运算,所述求和运算不是数学上简单的加,这个buffer的数据结构有关系,buffer数据结构不一样,算法也不一样,此处对所述算法不作限制。当读取数据后,还对所读取的数据进行处理。其中,可根据用户需要来对所读取的数据进行处理,例如将该数据转化成图像信号显示处理,或者仅仅是存储,此处对此不作限制。当读指针与写指针的进程进行到一定阶段,就可能会出现读指针与写指针出现互斥的问题,例如无数据可读,此为环形数据缓冲区为空的状态,又例如,写指针的绝对位置等于或超出所述读指针的绝对位置,并且所述写指针的相对位置超过所述读指针的相对位置时,此时为环形数据缓冲区溢出,因此,需要通过调整读指针与写指针的数值来保证读数据与写数据的顺利进行。调整的详细过程如下(如图4所示)
Cl、判断所述环形数据缓冲区是否异常,如果判断结果为是则根据异常类型返回相应的环形数据缓冲区异常信号,并转向步骤C2,否则转向C4,返回环形数据缓冲区正常信号。具体地,所述异常信号包括所述环形数据缓冲区溢出信号或所述环形数据缓冲区为空信号,所述环形数据缓冲区异常类型具体表现为
当所述写指针的相对位置超出所述读指针的相对位置时,并且所述所述写指针的绝对位置等于或超出所述读指针的绝对位置,则判定所述环形数据缓冲区为溢出,即来不及读取数据,此现象为所述环形数据缓冲区溢出;或者
当所述写指针的相对位置等于所述读指针相的相对位置,并且所述写指针的绝对位置与所述读指针的绝对位置相等,则所述环形数据缓冲区为空,即此处无数据可读。C2、根据异常类型执行相对应的操作。具体地,当所述写指针的相对位置超出所述读指针的相对位置时,并且所述写指针的绝对位置等于或超出所述读指针的位置时,调整所述读指针及所述写指针的绝对位置,使得所述写指针超前所述读指针。当所述写指针的相对位置等于所述读指针的相对位置,并且所述写指针的绝对位置与所述读指针的绝对位置相等,则所述环形数据缓冲区为空,读指针进入等待状态。具体地,当所述环形数据缓冲区为溢出时,表示数据来不及读取,因此需要调整所述读指针及所述写指针的绝对位置,使得所述写指针超前所述读指针。即保证此时所述写指针的相对位置等于所述读指针的相对位置,但是所述写指针的绝对位置超出所述读指针的绝对位置。当所述写指针的相对位置等于所述读指针的相对位置,并且所述写指针的绝对位置与所述读指针的绝对位置相等, 则所述环形数据缓冲区为空,表示此时无数据可读取,读指针处于等待状态,即读进程需要等待。此时写进程已经处于挂起状态,而读进程进入等待状态。本实施例中,当所述环形数据缓冲区处于溢出状态时,可以根据实际情况,调整写指针、读指针及读与写指针中的任意一种。以调整所述所述读指针及写指针的数值为例,说明所述环形数据缓冲区溢出时调整的过程
当写指针(wPtr)和读指针(rPtr)相对位置相等,但是写指针的绝对位置等于或超出读指针的绝对位置就说明没来的及读走数据,导致写指针赶上了读指针而使得所述环形数据缓冲区溢出,可能造成之前数据被覆盖掉,这个时候为了保证数据连贯性,本实施例中调整读指针,使得读指针rPtr = rPtr% BUFFER_NUM (其中,读指针rPtr = rPtr%BUFFER_ NUM表示重新给rPtr变量赋值,假设BUFFER_NUM等于8,未执行此步骤之前读指针的数值(rPtr )= 17,那么经过重新赋值后rPtr = 17%8 = 1,其中%是取余操作,此句执行完后,读指针的数值rPtr的值就是1,不再是17,然后将写指针wPtr指向的相对位置仍旧不变,可保证新数据不丢失,即wPtr = rPtr + BUFFER_NUM,但是数值上超前于读指针(rPtr )一个周期;可以理解的是写指针wPtr相对于环形数据缓冲区首位置的零地址的位置不变,但是数值上超前读指针rPtr —周,然后使读指针rPtr的相对位置超前写指针wPtr — 个单位的长度,也就是写指针wPtr仅比读指针rPtr多跑一圈,此时还是肩并肩,为了不肩并肩,那么就让读指针rPtr向前一步,即接着调整读指针rPtr = rPtr +1,使其在相对位置上超前写指针wPtr I个单元,此时环形数据缓冲区不会溢出,同样也是为了数据连贯性, 这样可保证之前的数据不丢失。需要说明的是,本实施例中,读数据及写数据的进程是可以多次在进行的,调整之后可能还会出现需要调整所述读指针及写指针来使得所述环形数据缓冲区处于正常状态, 因此,所述步骤C2以后还可根据实际情况的需要而再次调整所述写指针及读指针
C3、当所述写指针的绝对位置等于或者超出所述读指针的绝对位置时,并且所述写指针的相对位置与所述读指针的相对位置相等时,分别重新对所述读指针及写指针进行调整,使得所述写指针超前所述读指针。其中,如何对所述读指针及写指针调整(赋值)是根据具体情况而定,此处对此不作限制。需要说明的是,无论读指针及写指针的数值怎么加减,二者必须保持特定的数值和位置关系,因为写指针控制着当前数据的写入位置,而读指针控制着当前读取数据的位置,必须时刻保持有数据可读,同时要保证要及时读取数据,使得数据读取的连贯性,进而保证数据读取的准确性。本实施例中,当一次写缓冲完成后,会继续进行一下次数据的写入,会循环执行步骤S14至步骤S15,循环写入,可以防止读进程无数据可取)。本实施例中,写进程在写完数据后会唤醒读进程;写进程和读进程是独立的进程, 通过读写指针、队列等机制进行sync (同步),写过程可以由硬件本身提供的中断或者软件查询机制来控制,而读进程则需要由写进程控制,并不是每写一次就会去读,读是需要满足条件,但是写进程至少已经已经写入一个单位长度的数据后,才能启动读进程;有或者可能会出现写了 3次了,读进程还在等待直到读条件满足,而读进程在完成一次读取操作后,需要由软件将其设为挂起状态也就是休眠状态,也就是读进程始终处于被动状态。本实施例中,写进程与读进程分开执行,但是实时监控环形数据缓冲区的异常,当所述环形数据缓冲区出现异常时,调整读指针及写指针,使得读数据及写数据可以顺利进行,避免了读进程与写进程同时进行时对环形数据缓冲区进行操作而造成的临界资源访问异常的问题。保证了数据传输的效率,进一步提供了数据传输的精确度。基于上述实施例,本发明还提供了一种用环形数据缓冲区读写批量数据的装置, 如图5所示,包括
写指针控制单元510、读指针控制单元520、指针调整单元530,其中,所述装置还可包括定义单元501、列队建立单元502、缓冲区申请单元503及初始化单元504,具体地,所述指针调整单元530包括第一判断模块531、第二判断模块532、调整控制模块533。为了方便理解,下面详细描述本实施例的装置的工作原理
定义单元501定义多个缓冲区,其中,所述缓冲区的个数与所述环形数据缓冲区的个数相等;具体地,所述多个缓冲区可用BUFFER_NUM表示,进一步地,定义例如定义#defineBUFFER_NUM 8或者const int BUFFER _NUM = 8。接着列队建立单元502建立等待列队,具体地,启动外设,初始化外设,申明和建立一个读进程等待队列项,初始化其状态为休眠状态,将其加入到等待队列链表。缓冲区申请单元503申请至少一个缓冲区作为环形数据缓冲区,具体地,所述缓冲区的地址单元是连续的,而所述缓冲区的数量可根据数据的大小来设计,此处对此不作限制。接着初始化单元504初始化所述读指针、写指针的数值,使所述读指针、写指针的数值均为O。具体地,申请固定个数连续地址单元(单元大小根据需要定)作为缓冲区(buffer),定义和初始化读(rPtr)、写(wPtr)指针,使其指向buffer的头部。具体地,本实施例中缓冲区个数=BUFFER_NUM,BUFFER_NUM为整数。但是 “BUFFER_NUM个连续地址单元”大小=BUFFER_NUM *每个单元大小,每个单元大小可根据需要定义,比如说8192个字节。本步骤中例如,定义所述读指针为rPtr,所述写指针为wPtr ;并将所述rPtr和 wPtr定义为整数或者指针类型;不管什么类型,在初始化时必须使二者指向buffer的头部 (或者首地址)。当将所述rPtr和wPtr定义为整数类型时,在初始化时使rPtr=wPtr = O ;当将所述rPtr和wPtr定义为指针类型时,在初始化时使rPtr和wPtr指向所述环形缓冲区的首地址。当然运行的过程中,为了保证数据的连续性和准确性,wPtr必须超前于rptr,且rptr 不能追上wPtr。需要说明的是,本实施例中,既有读数据,也有写数据的过程,开始的时候,首先进行的是写进程,当写进程进行到一定时候(至少已经写入一个单位的数据后),写进程唤醒等待队列的读数据进程,但是当写进程及读进程均启动之后,但是读数据与写数据之间没有严格的顺序,此处对此不作限制,下面分别详细说明读数据与写数据的具体过程
写指针控制单元510接收到数据写请求时,控制写指针计算出在环形数据缓冲区当前要写入数据的环形缓冲区的起始位置,并读取外设数据,从该起始位置开始向所述环形缓冲区写入指定单位个数据,写完指定单位个数据后写指针加I。进一步地,使用环形数据缓冲区首位置的零位置与写指针wPtr的数值做求和运算,所述求和运算不是数学上简单的相加,这与缓冲区buffer的数据结构有关系,缓冲区 buffer数据结构不一样,算法也不一样,此处对此不作限制。本实施例中,所述读指针或写指针的数值(即绝对位置)是指相对于所述环形数据缓冲区首地址零位置实际所表示的数值,所述绝对位置是指针当前的位置相对于所述环形数据缓冲区首地址零位置实际所表示的数值,其大小不定(可能会随着写入或读取次数一直增加);所述相对位置是指针当前的位置相对于所述环形数据缓冲区首地址的距离,其大小不会超过缓冲区的长度。另外,零地址也就是首地址。进一步地,当写进程进行到一定程度时(此处的程度是根据实际情况而定,即保证有数据可读的时候),所述写指针进程会向所述读指针发送唤醒信号,唤醒等待列队中的读指针读取数据,而读指针只能在被唤醒之后才能读取数据。读指针控制单元520接收到唤醒信号后,触发所述读指针,第一判断模块531判断所述读指针的数值是否小于所述写指针的数值,如果是则向所述读指针控制单元520发送数据读请求,否则向所述读指针控制单元520返回无数据可读信息。当接收到数据读请求后,所述读指针控制单元520控制读指针计算当前需要读取的数据所在的位置,从该位置开始读取数据,读完后所述读指针的数值加I ;其中,当有数据到来时,读指针计算出当前要读buffer (缓冲区)的起始位置(currReadPtr),如图6所示的读指针指示的当前读取的起始位置,然后读取外设数据,从该起始位置开始向buffer (缓冲区)读指定单位个数据如 N (N —般设为I个Buffer的单位长度)个数据,读完后写指针加I。具体地,利用读指针的数值与buffer的首地址做求和运算,所述求和运算不是数学上简单的加,这个buffer的数据结构有关系,buffer数据结构不一样,算法也不一样,此处对所述算法不作限制。当读取数据后,还对所读取的数据进行处理。其中,可根据用户需要来对所读取的数据进行处理, 例如将该数据转化成图像信号显示处理,或者仅仅是存储,此处对此不作限制。当读指针与写指针的进程进行到一定阶段,就可能会出现读指针与写指针出现互斥的问题,例如无数据可读,此为环形数据缓冲区为空的状态,又例如,写指针的绝对位置及相对位置均分别超前所述读指针的绝对位置及相对位置时,此时为环形数据缓冲区溢出。因此,需要通过调整读指针与写指针来保证读数据与写数据的顺利进行。因此,第二判断模块532判断所述环形数据缓冲区是否异常,如果为是则根据异常类型向所述调整控制模块533返回环形数据缓冲区异常信号,否则向所述调整控制模块 533返回环形数据缓冲区正常信号。具体地,所述异常信号包括所述环形数据缓冲区溢出信号或所述环形数据缓冲区为空信号,所述环形数据缓冲区异常类型表现为
当所述写指针的相对位置等于所述读指针的相对位置,并且所述所述写指针的绝对位置等于或超前所述读指针的绝对位置,则判定所述环形数据缓冲区为溢出,即来不及读取数据,此现象为异常;或者
当所述写指针的相对位置等于所述读指针的相对位置,并且所述写指针的绝对位置与所述读指针的绝对位置相等,则所述环形数据缓冲区为空,即此处无数据可读。当所述调整控制模块533接收到所述环形数据缓冲区溢出信号后,调整所述读指针及写指针的绝对位置,使得所述写指针超前所述读指针。或者当所述调整控制模块533 接收到所述环形数据缓冲区为空信号后,控制所述读指针进入等待状态,此时写进程已经处于挂起状态,而读进程进入等待状态。本实施例中,当判断需要调整时,可以根据实际情况,调整写指针、读指针及读与与指针中的任意一种。以调整所述读指针及写指针的数值为例,说明所述环形数据缓冲区溢出时调整的过程
当写指针(wPtr)和读指针(rPtr)相对位置相等,但是写指针的绝对、位置等于或者超出所述读指针的绝对位置就说明没来的及读走数据,导致写指针赶上了读指针而使得所述环形数据缓冲区溢出,可能造成之前数据被覆盖掉,这个时候为了保证数据连贯性,本实施例中调整读指针,使得读指针rPtr = rPtr% BUFFER_NUM (其中读指针rPtr = rPtr%BUFFER_NUM表示重新给rPtr变量赋值,假设BUFFER_NUM等于8,未执行此步骤之前读指针的数值(rPtr ) = 17,那么经过重新赋值后rPtr = 17%8 = 1,其中%是取余操作,此句执行完后,读指针的数值rPtr的值就是1,不再是17,因此此时读指针的数值大于所述写指针的数值,因此环形数据缓冲区不会溢出,然后将写指针wPtr指向的相对位置仍旧不变,可保证新数据不丢失,即写指针wPtr = rPtr + BUFFER_NUM,但是数值上超前于读指针(rPtr ) 一个周期;可以理解的是写指针WPtr相对于环形数据缓冲区首位置的零地址的位置不变,但是数值上超前读指针rPtr —周,然后使读指针rPtr的相对位置超前写指针wPtr —个单位的长度,即写指针wPtr仅超前读指针rPtr —个周期,此时相对位置还是相等,但是为了写入新数据,那么就让读指针rPtr向前一步,即接着调整读指针rPtr = rPtr +1,使其在相对位置上超前写指针wPtr I个单元,此时环形数据缓冲区不会溢出,同样是为了数据连贯性,这样可保证之前的数据不丢失。需要说明的是,本实施例中,读数据及写数据的进程是可以多次在进行的,调整之后可能还会出现需要调整所述读指针及写指针来使得所述环形数据缓冲区处于正常状态, 因此,所述调整控制模块533判断所述写指针的绝对位置等于或者超出所述读指针的绝对位置时,并且所述写指针的相对位置与所述读指针的相对位置相等时,向所述赋值模块534 发送调整指令,所述赋值模块534接收到调整指令后,重新对所述读指针及写指针赋值,使得所述写指针的超前所述读指针,即保证所述写指针的相对位置等于所述读指针的相对位置,但是所述写指针的绝对位置超前或等于所述读指针的绝对位置。即尚未读取的数据不会在未读之前被新写入的数据覆盖,进而使得数据不连续。其中,如何对所述读指针及写指针赋值是根据具体情况而定,此处对此不作限制。需要说明的是,无论读指针及写指针的数值怎么加或减,二者必须保持特定的数值和位置关系,因为写指针控制着当前数据的写入位置,而读指针控制着当前读取数据的位置,必须时刻保持有数据可读,同时要保证要及时读取数据,使得数据读取的连贯性,进而保证数据读取的准确性。本实施例中,写进程在写完数据后会唤醒读进程;写进程和读进程是独立的进程, 通过读写指针、队列等机制进行sync (同步),写过程可以由硬件本身提供的中断或者软件查询机制来控制,而读进程则需要由写进程控制,并不是每写一次就会去读,读是需要满足条件,但是写进程至少已经已经写入一个单位长度的数据后,才能启动读进程;有或者可能会出现写了 3次了,读进程还在等待直到读条件满足,而读进程在完成一次读取操作后,需要由软件将其设为挂起状态也就是休眠状态,也就是读进程始终处于被动状态。本实施例中,写进程与读进程分开执行,实时监控环形数据缓冲区的异常,当所述环形数据缓冲区出现异常时,调整读指针及写指针,使得读数据及写数据可以顺利进行,避免了读进程与写进程同时进行时对对环形数据缓冲区进行操作而造成的临界资源访问异常的问题。进一步提供了数据传输的精确度。应当理解的是,本发明的应用不限于上述的举例,对本领域普通技术人员来说,可以根据上述说明加以改进或变换,所有这些改进和变换都应属于本发明所附权利要求的保护范围。
权利要求
1 一种用环形数据缓冲区读写批量数据的方法,其特征在于,包括步骤A、当有数据写请求时,写指针计算出在环形数据缓冲区当前要写入数据的起始位置, 读取外设数据,从该起始位置开始向所述环形缓冲区写入数据,写完后所述写指针的数值加I ;B、当收到读数据请求时,读指针计算当前需要读取的数据所在的位置,从该位置开始读取数据,读完后所述读指针的数值加I ;C、当所述环形数据缓冲区出现异常,根据异常类型执行相应的操作,其中,所述异常的类型包括所述环形数据缓冲区溢出或为空。
2.根据权利要求I所述用环形数据缓冲区读写批量数据的方法,其特征在于,所述步骤A之前还包括Al、定义多个缓冲区,其中,所述缓冲区的个数与所述环形数据缓冲区的个数相等;A2、建立等待列队;A3、申请至少一个缓冲区作为环形数据缓冲区,所述缓冲区的地址单元是连续的;A4、初始化所述读指针、写指针的数值,使所述读指针、写指针的数值均为O;所述步骤B之前还包括BI、判断是否收到唤醒信号,如果是,则转向步骤B2,否则返回等待唤醒信号;B2、判断当前的读指针的绝对位置是否小于写指针的绝对位置,如果判断结果为是时, 则进入步骤B,否则表示无数据可读,返回所述步骤BI。
3.根据权利要求I所述用环形数据缓冲区读写批量数据的方法,其特征在于,所述步骤C具体包括Cl、当所述写指针的相对位置超出或等于所述读指针的相对位置,并且所述写指针的绝对位置超出所述读指针的绝对位置,则所述环形缓冲区溢出,发出溢出信号,并进入步骤 C3 ;C2、当所述写指针的相对位置等于所述读指针的相对位置,并且所述写指针的绝对位置与所述读指针的绝对位置相等,则所述环形数据缓冲区为空,则返回所述环形数据缓冲区为空的信号,并进入步骤C4;C3、调整所述读指针及所述写指针的绝对位置,使得所述写指针超前所述读指针;C4、读指针进入等待状态。
4.根据权利要求3所述用环形数据缓冲区读写批量数据的方法,其特征在于,所述步骤C3之后具体还包括当所述写指针的绝对位置等于或者超出所述读指针的绝对位置时,并且所述写指针的相对位置与所述读指针的相对位置相等时,分别重新对所述读指针及写指针进行调整,使得所述写指针超前所述读指针。
5.根据权利要求I至4任意一项所述用环形数据缓冲区读写批量数据的方法,其特征在于,所述读指针的绝对位置是指所述读指针相对于所述环形数据缓冲区首地址零位置实际所表示的数值;所述写指针的绝对位置是指所述写指针相对于所述环形数据缓冲区首地址零位置实际所表示的数值;所述读指针的相对位置是指所述读指针当前的位置相对于所述环形数据缓冲区首地址的距离,所述写指针的相对位置是指所述写指针当前的位置相对于所述环形数据缓冲区首地址的距离。
6.一种用环形数据缓冲区读写批量数据的装置,其特征在于,包括写指针控制单元,当有数据写请求时,用于控制写指针计算出在环形数据缓冲区当前要写入数据的起始位置,读取外设数据,从该起始位置开始向所述环形缓冲区写入数据,写完后所述写指针的数值加I ;读指针控制单元,当收到读数据请求时,用于控制读指针计算当前需要读取的数据所在的位置,从该位置开始读取数据,读完后所述读指针的数值加I ;指针调整单元,当所述环形数据缓冲区出现异常,根据异常类型执行相应的操作,其中,所述异常的类型包括所述环形数据缓冲区溢出或为空。
7.根据权利要求6所述用环形数据缓冲区读写批量数据的装置,其特征在于,其还包括定义单元,用于定义多个缓冲区,其中,所述缓冲区的个数与所述环形数据缓冲区的个数相等;列队建立单元,用于建立等待列队;缓冲区申请单元,用于申请至少一个缓冲区作为环形数据缓冲区,所述缓冲区的地址单元是连续的;初始化单元,用于初始化所述读指针、写指针的数值,使所述读指针、写指针的数值均为O。
8.根据权利要求7所述用环形数据缓冲区读写批量数据的装置,其特征在于,所述指针调整单元包括第一判断模块,用于判断所述读指针是否收到唤醒信号,如果为是,则唤醒所述读指针,接着并判断当前的读指针的绝对位置是否小于写指针的绝对位置;第二判断模块,用于判断所述环形数据缓冲区是否异常,根据异常类型向调整控制模块发送相对应的所述环形数据缓冲区异常信号,其中,所述异常信号包括所述环形数据缓冲区溢出信号或所述环形数据缓冲区为空信号;调整控制模块,当接收到所述环形数据缓冲区溢出信号时,用于调整所述读指针及所述写指针的绝对位置,使得所述写指针超前所述读指针;或当接收到所述环形数据缓冲区为空信号时,用于控制所述读指针进入等待状态。
9.根据权利要求8所述用环形数据缓冲区读写批量数据的装置,其特征在于,所述第二判断模块还用于再次判断所述写指针的绝对位置是否等于或者超出所述读指针的绝对位置,并且判断所述写指针的相对位置与所述读指针的相对位置是否相等; 所述指针调整单元还用于当所述写指针的绝对位置等于或超出所述读指针的绝对位置时,并且当所述写指针的相对位置等于所述读指针的相对位置时,分别重新对所述读指针及写指针进行调整,使得所述写指针超前所述读指针。
10.根据权利要求6至9任意一项所述用环形数据缓冲区读写批量数据的装置,其特征在于,所述读指针的绝对位置是指所述读指针相对于所述环形数据缓冲区首地址零位置实际所表示的数值;所述写指针的绝对位置是指所述写指针相对于所述环形数据缓冲区首地址零位置实际所表示的数值;所述读指针的相对位置是指所述读指针当前的位置相对于所述环形数据缓冲区首地址的距离,所述写指针的相对位置是指所述写指针当前的位置相对于所述环形数据缓冲区首地址的距离。
全文摘要
本发明公开了一种用环形数据缓冲区读写批量数据的方法及装置,所述方法包括当有数据写请求时,写指针计算出在环形数据缓冲区当前要写入数据的起始位置,读取外设数据,从该起始位置开始向所述环形缓冲区写入数据,写完后写指针的数值加1;当收到读数据请求时,读指针计算当前需要读取的数据所在的位置,从该位置开始读取数据,读完后述读指针的数值加1;当环形数据缓冲区出现异常,根据异常类型执行相应的操作,本发明中,写进程与读进程分开执行,监控环形数据缓冲区的异常,当环形数据缓冲区出现异常时,调整读指针及写指针,使得读数据及写数据可以顺利进行,保证了数据传输的效率,进一步提供了数据传输的精确度。
文档编号G06F13/16GK102591815SQ20111044436
公开日2012年7月18日 申请日期2011年12月27日 优先权日2011年12月27日
发明者刘亚萍 申请人:Tcl集团股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1