CN102591815B - 一种用环形数据缓冲区读写批量数据的方法及装置 - Google Patents

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

Info

Publication number
CN102591815B
CN102591815B CN201110444367.9A CN201110444367A CN102591815B CN 102591815 B CN102591815 B CN 102591815B CN 201110444367 A CN201110444367 A CN 201110444367A CN 102591815 B CN102591815 B CN 102591815B
Authority
CN
China
Prior art keywords
pointer
write
read
data
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
Application number
CN201110444367.9A
Other languages
English (en)
Other versions
CN102591815A (zh
Inventor
刘亚萍
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
TCL Corp
Original Assignee
TCL Corp
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by TCL Corp filed Critical TCL Corp
Priority to CN201110444367.9A priority Critical patent/CN102591815B/zh
Publication of CN102591815A publication Critical patent/CN102591815A/zh
Application granted granted Critical
Publication of CN102591815B publication Critical patent/CN102591815B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Information Transfer Systems (AREA)

Abstract

本发明公开了一种用环形数据缓冲区读写批量数据的方法及装置,所述方法包括:当有数据写请求时,写指针计算出在环形数据缓冲区当前要写入数据的起始位置,读取外设数据,从该起始位置开始向所述环形缓冲区写入数据,写完后写指针的数值加1;当收到读数据请求时,读指针计算当前需要读取的数据所在的位置,从该位置开始读取数据,读完后述读指针的数值加1;当环形数据缓冲区出现异常,根据异常类型执行相应的操作,本发明中,写进程与读进程分开执行,监控环形数据缓冲区的异常,当环形数据缓冲区出现异常时,调整读指针及写指针,使得读数据及写数据可以顺利进行,保证了数据传输的效率,进一步提供了数据传输的精确度。

Description

一种用环形数据缓冲区读写批量数据的方法及装置
技术领域
本发明涉及图像数据处理领域,尤其涉及的是一种用环形数据缓冲区读写批量数据的方法及装置。
背景技术
在图像处理中,经常会需要采集批量数据或者及显示多幅图像的,保证数据的完整性是图像处理的基本要求,因此,在图像处理过程中数据的传输与通信就是关键。
通常,数据都是从外设数据缓冲到终端设备的内存后再进行处理的,然而不论是个人电脑(PC)还是其它嵌入式设备终端,内存总是有限的,一次性地申请一个内存来缓冲这些数据是比较困难的,所以就需要使用环形数据缓冲区的数据结构来解决这一难题。
环形缓冲区是一个先进先出的循环缓冲区,通常有一个读指针和一个写指针,程序中通过移动读指针和写指针就可以实现缓冲区的数据读取和写入,由于有时读指针与写指针是同时使用的,所以会使得缓冲区产生互斥问题,这会影响到数据传输的准确性及数据传输的效率。
发明内容
本发明要解决的技术问题在于,针对现有技术的上述缺陷,提供一种用环形数据缓冲区读写批量数据的方法及装置,使用环形缓冲区与队列控制相结合的方法来解决图像处理过程中在缓冲区产生读取数据与写入数据互斥的问题。
本发明解决技术问题所采用的技术方案如下:
一种用环形数据缓冲区读写批量数据的方法,包括步骤:
A、当有数据写请求时,写指针计算出在环形数据缓冲区当前要写入数据的起始位置,读取外设数据,从该起始位置开始向所述环形缓冲区写入数据,写完后所述写指针的数值加1;
B、当收到读数据请求时,读指针计算当前需要读取的数据所在的位置,从该位置开始读取数据,读完后所述读指针的数值加1;
C、当所述环形数据缓冲区出现异常,根据异常类型执行相应的操作,其中,所述异常的类型包括所述环形数据缓冲区溢出或为空。
优选地,所述步骤A之前还包括:
A1、定义多个缓冲区,其中,所述缓冲区的个数与所述环形数据缓冲区的个数相等;
A2、建立等待列队;
A3、申请至少一个缓冲区作为环形数据缓冲区,所述缓冲区的地址单元是连续的;
A4、初始化所述读指针、写指针的数值,使所述读指针、写指针的数值均为0;
所述步骤B之前还包括:
B1、判断是否收到唤醒信号,如果是,则转向步骤B2,否则返回等待唤醒信号;
B2、判断当前的读指针的绝对位置是否小于写指针的绝对位置,如果判断结果为是时,则进入步骤B,否则表示无数据可读,返回所述步骤B1。
优选地,所述步骤C具体包括:
C1、当所述写指针的相对位置超出或等于所述读指针的相对位置,并且所述写指针的绝对位置超出所述读指针的绝对位置,则所述环形缓冲区溢出,发出溢出信号,并进入步骤C3;
C2、当所述写指针的相对位置等于所述读指针的相对位置,并且所述写指针的绝对位置与所述读指针的绝对位置相等,则所述环形数据缓冲区为空,则返回所述环形数据缓冲区为空的信号,并进入步骤C4;
C3、调整所述读指针及所述写指针的绝对位置,使得所述写指针超前所述读指针;
C4、读指针进入等待状态。
优选地,所述步骤C3之后具体还包括:
当所述写指针的绝对位置等于或者超出所述读指针的绝对位置时,并且所述写指针的相对位置与所述读指针的相对位置相等时,分别重新对所述读指针及写指针进行调整,使得所述写指针超前所述读指针。
优选地,所述读指针的绝对位置是指所述读指针相对于所述环形数据缓冲区首地址零位置实际所表示的数值;所述写指针的绝对位置是指所述写指针相对于所述环形数据缓冲区首地址零位置实际所表示的数值;
所述读指针的相对位置是指所述读指针当前的位置相对于所述环形数据缓冲区首地址的距离,所述写指针的相对位置是指所述写指针当前的位置相对于所述环形数据缓冲区首地址的距离。
本发明还提供一种实现上述方法的装置:
一种用环形数据缓冲区读写批量数据的装置,包括:
写指针控制单元,当有数据写请求时,用于控制写指针计算出在环形数据缓冲区当前要写入数据的起始位置,读取外设数据,从该起始位置开始向所述环形缓冲区写入数据,写完后所述写指针的数值加1;
读指针控制单元,当收到读数据请求时,用于控制读指针计算当前需要读取的数据所在的位置,从该位置开始读取数据,读完后所述读指针的数值加1;
指针调整单元,当所述环形数据缓冲区出现异常,根据异常类型执行相应的操作,其中,所述异常的类型包括所述环形数据缓冲区溢出或为空。
优选地,其还包括:
定义单元,用于定义多个缓冲区,其中,所述缓冲区的个数与所述环形数据缓冲区的个数相等;
列队建立单元,用于建立等待列队;
缓冲区申请单元,用于申请至少一个缓冲区作为环形数据缓冲区,所述缓冲区的地址单元是连续的;
初始化单元,用于初始化所述读指针、写指针的数值,使所述读指针、写指针的数值均为0。
优选地,所述指针调整单元包括:
第一判断模块,用于判断所述读指针是否收到唤醒信号,如果为是,则唤醒所述读指针,接着并判断当前的读指针的绝对位置是否小于写指针的绝对位置;
第二判断模块,用于判断所述环形数据缓冲区是否异常,根据异常类型向调整控制模块发送相对应的所述环形数据缓冲区异常信号,其中,所述异常信号包括所述环形数据缓冲区溢出信号或所述环形数据缓冲区为空信号;
调整控制模块,当接收到所述环形数据缓冲区溢出信号时,用于调整所述读指针及所述写指针的绝对位置,使得所述写指针超前所述读指针;或当接收到所述环形数据缓冲区为空信号时,用于控制所述读指针进入等待状态。
优选地,所述第二判断模块还用于再次判断所述写指针的绝对位置是否等于或者超出所述读指针的绝对位置,并且判断所述写指针的相对位置与所述读指针的相对位置是否相等;
所述指针调整单元还用于当所述写指针的绝对位置等于或超出所述读指针的绝对位置时,并且当所述写指针的相对位置等于所述读指针的相对位置时,分别重新对所述读指针及写指针进行调整,使得所述写指针超前所述读指针。
优选地,所述读指针的绝对位置是指所述读指针相对于所述环形数据缓冲区首地址零位置实际所表示的数值;所述写指针的绝对位置是指所述写指针相对于所述环形数据缓冲区首地址零位置实际所表示的数值;
所述读指针的相对位置是指所述读指针当前的位置相对于所述环形数据缓冲区首地址的距离,所述写指针的相对位置是指所述写指针当前的位置相对于所述环形数据缓冲区首地址的距离。
本发明所提供的用环形数据缓冲区读写批量数据的方法及装置,写进程与读进程分开执行,实时监控环形数据缓冲区的异常,当所述环形数据缓冲区出现异常时,调整读指针及写指针,使得读数据及写数据可以顺利进行,避免了读进程与写进程同时进行时对环形数据缓冲区进行操作而造成的临界资源访问异常的问题,保证了数据传输的效率,进一步提供了数据传输的精确度。
附图说明
图1是本发明实施例的用环形数据缓冲区读写批量数据的方法流程图。
图2是本发明应用实施例的写环形缓冲区的过程流程图。
图3是本发明应用实施例的读环形缓冲区的过程流程图。
图4是本发明应用实施例的环形数据缓冲区调整过程流程图。
图5是本发明实施例的用环形数据缓冲区读写批量数据的装置原理框图。
图6是本发明应用实施例的环形缓冲区结构示意图。
具体实施方式
本发明所提供的用环形数据缓冲区读写批量数据的方法及装置,为使本发明的目的、技术方案及优点更加清楚、明确,以下参照附图并举实施例对本发明进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
本发明实施例的一种用环形数据缓冲区读写批量数据的方法,如图1所示,主要包括以下步骤:
步骤S100、当有数据写请求时,写指针计算出在环形数据缓冲区当前要写入数据的起始位置,读取外设数据,从该起始位置开始向所述环形缓冲区写入数据,写完后所述写指针的数值加1。本实施例中,所述数据写请求携带写入数据的数量,可以是指定单位个数据,例如8192个字节的数据。本实施例中,指针的数值最小单位为1,并且该数值都是整数。进一步地,计算所述起始位置时,根据所述写指针的绝对位置与所述环形数据缓冲区的首地址做求和运算,计算出当前需要写入数据的起始位置。其中的计算方法可根据所述环形数据缓冲区的结构而设计,此处对此不作限制。当写完数据时,写指针的数值加1。
步骤S200、当收到读数据请求时,读指针计算当前需要读取的数据所在的位置,从该位置开始读取数据,读完后所述读指针的数值加1。本实施例中,进一步地,计算所述起始位置时,根据所述读指针的绝对位置与所述环形数据缓冲区的首地址做求和运算,计算出当前需要读取数据的起始位置。其中的计算方法可根据所述环形数据缓冲区的结构而设计,此处对此同样不作限制。当读取完数据时,读指针的数值加1。
步骤S300、当所述环形数据缓冲区出现异常,根据异常结果执行相应的操作,其中,所述异常的体现包括所述环形数据缓冲区溢出。本实施例中,当所述环形数据缓冲区溢出时,则说明读指针与写指针处于异常状态,则需要调整该读指针及写指针。具体地,分别将所述读指针及所述写指针的绝对位置相对于环形缓冲区首地址的长度值取余数,使得所述环形数据缓冲区处于正常状态(即既不溢出也不是为空)。
本实施例中,当环形数据缓冲区异常时,则根据异常类型执行相应的操作,保证了数据传输的准确性,提供数据传输的效率。
以下将通过一具体的应用实施例对本发明的用环形数据缓冲区读写批量数据的方法做进一步详细的说明:
本实用实施例中假设是数据从图像采集外设向嵌入式终端传输,并在终端处理后显示,环形缓冲区的示意图如图6(假设buffer(缓冲区)个数为8)。
如图2所示,本应用实施例主要包括以下步骤:
S10 :定义多个缓冲区,其中,所述缓冲区的个数与所述环形数据缓冲区的个数相等;具体地,所述多个缓冲区可用BUFFER_NUM表示,进一步地,定义例如定义#define BUFFER_NUM  8 或者 const int  BUFFER_NUM = 8。接着转到步骤S11。
S11、建立等待列队,具体地,启动外设,初始化外设,申明和建立一个读进程等待队列项,初始化其状态为休眠状态,将其加入到等待队列链表。
S12、申请至少一个缓冲区作为环形数据缓冲区,具体地,所述缓冲区的地址单元是连续的;
S13、初始化所述读指针、写指针的数值,使所述读指针、写指针的数值(即绝对位置)均为0。具体地,申请固定个数连续地址单元(单元大小根据需要定)作为缓冲区(buffer),定义和初始化读(rPtr)、写(wPtr)指针,使其指向buffer的头部。
其中,本实施例中缓冲区个数=BUFFER_NUM,BUFFER_NUM为整数。但是 “BUFFER_NUM个连续地址单元”大小 = BUFFER_NUM  * 每个单元大小 ,每个单元大小可根据需要定义,比如说8192个字节。
本步骤中例如,定义所述读指针为rPtr,所述写指针为wPtr;并将所述rPtr和wPtr定义为整数或者指针类型;不管什么类型,在初始化时必须使二者指向buffer的头部(或者首地址)。
当将所述rPtr和wPtr定义为整数类型时,在初始化时使rPtr的数值(即绝对位置)=wPtr的数值(即绝对位置) = 0;当将所述rPtr和wPtr定义为指针类型时,在初始化时使读指针rPtr和写指针wPtr指向所述环形缓冲区的首地址。当然运行的过程中,为了保证数据的连续性和准确性,写指针wPtr必须超前于读指针rptr,且读指针rptr不能追上写指针wPtr。
需要说明的是,本实施例中,既有读数据,也有写数据的过程,开始的时候,首先进行的是写进程,当写进程进行到一定时候,写进程唤醒等待队列的读数据进程,当写进程及读进程均启动之后,但是读数据与写数据之间没有严格的顺序,此处对此不作限制,下面分别详细说明读数据与写数据的具体过程:
写数据的具体过程:
S14,判断是否有数据写请求,当判断结果为是时进入步骤S15、当判断结果为否时,转向步骤S16,等待,返回重新判断是否有数据写请求,即等待数据写请求的到来。
S15、写指针计算出在环形数据缓冲区当前要写入数据的环形缓冲区的起始位置,并读取外设数据,从该起始位置开始向所述环形缓冲区写入指定单位个数据,写完指定单位个数据后写指针加1。
例如,当有数据到来时,先根据写指针计算出当前要写buffer(缓冲区)的起始位置(currWritePtr),如图6所示的写指针指示的当前写入的起始位置,然后读取外设数据,从该起始位置开始向buffer(缓冲区)写指定单位个数据如N(N一般设为1个Buffer的单位长度)个数据,写完后写指针加1。
本步骤中,使用环形数据缓冲区首位置(零位置)与写指针wPtr的绝对位置做求和运算,所述求和运算不是数学上简单的加,这与缓冲区buffer的数据结构有关系,缓冲区buffer数据结构不一样,算法也不一样,此处对此不作限制。
本实施例中,所述读指针或写指针的数值(即绝对位置)是读或写指针当前的位置相对于所述环形数据缓冲区首地址(零位置)实际所表示的数值,其大小不定(可能会随着写入或读取次数一直增加);所述相对位置是读或写指针当前的位置相对于所述环形数据缓冲区首地址的距离,其大小不会超过缓冲区的长度。另外,零地址也就是首地址。
读数据的具体过程(如图3所示):
D40、判断是否收到唤醒信号,如果为是,则转向步骤D41,否则转向步骤D43,返回等待唤醒信号。本实施例中,当没有数据可读的时候,读指针处于等待列队之中,等待写指针写进程的唤醒信号后才能读取数据。
D41、判断当前的读指针的绝对位置是否小于写指针的绝对位置,如果判断结果为是时,则进入步骤D42,否则表示无数据可读,返回所述步骤D40。
D42、读指针接收读数据请求,计算当前需要读取的数据所在的位置,从该位置开始读取数据,读完后所述读指针的数值加1;其中,当有数据到来时,读指针计算出当前要读buffer(缓冲区)的起始位置(currReadPtr),如图6所示的读指针指示的当前读取的起始位置,然后读取外设数据,从该起始位置开始向buffer(缓冲区)读指定单位个数据如N(N一般设为1个Buffer的单位长度)个数据,读完后写指针加1。具体地,利用读指针的数值与buffer的首地址做求和运算,所述求和运算不是数学上简单的加,这个buffer的数据结构有关系,buffer数据结构不一样,算法也不一样,此处对所述算法不作限制。当读取数据后,还对所读取的数据进行处理。其中,可根据用户需要来对所读取的数据进行处理,例如将该数据转化成图像信号显示处理,或者仅仅是存储,此处对此不作限制。
当读指针与写指针的进程进行到一定阶段,就可能会出现读指针与写指针出现互斥的问题,例如无数据可读,此为环形数据缓冲区为空的状态,又例如,写指针的绝对位置等于或超出所述读指针的绝对位置,并且所述写指针的相对位置超过所述读指针的相对位置时,此时为环形数据缓冲区溢出,因此,需要通过调整读指针与写指针的数值来保证读数据与写数据的顺利进行。
调整的详细过程如下(如图4所示):
C1、判断所述环形数据缓冲区是否异常,如果判断结果为是则根据异常类型返回相应的环形数据缓冲区异常信号,并转向步骤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 1个单元,此时环形数据缓冲区不会溢出,同样也是为了数据连贯性,这样可保证之前的数据不丢失。
需要说明的是,本实施例中,读数据及写数据的进程是可以多次在进行的,调整之后可能还会出现需要调整所述读指针及写指针来使得所述环形数据缓冲区处于正常状态,因此,所述步骤C2以后还可根据实际情况的需要而再次调整所述写指针及读指针:
C3、当所述写指针的绝对位置等于或者超出所述读指针的绝对位置时,并且所述写指针的相对位置与所述读指针的相对位置相等时,分别重新对所述读指针及写指针进行调整,使得所述写指针超前所述读指针。其中,如何对所述读指针及写指针调整(赋值)是根据具体情况而定,此处对此不作限制。
需要说明的是,无论读指针及写指针的数值怎么加减,二者必须保持特定的数值和位置关系,因为写指针控制着当前数据的写入位置,而读指针控制着当前读取数据的位置,必须时刻保持有数据可读,同时要保证要及时读取数据,使得数据读取的连贯性,进而保证数据读取的准确性。
本实施例中,当一次写缓冲完成后,会继续进行一下次数据的写入,会循环执行步骤S14至步骤S15,循环写入,可以防止读进程无数据可取)。
本实施例中,写进程在写完数据后会唤醒读进程;写进程和读进程是独立的进程,通过读写指针、队列等机制进行sync(同步),写过程可以由硬件本身提供的中断或者软件查询机制来控制,而读进程则需要由写进程控制,并不是每写一次就会去读,读是需要满足条件,但是写进程至少已经已经写入一个单位长度的数据后,才能启动读进程;有或者可能会出现写了3次了,读进程还在等待直到读条件满足,而读进程在完成一次读取操作后,需要由软件将其设为挂起状态也就是休眠状态,也就是读进程始终处于被动状态。
本实施例中,写进程与读进程分开执行,但是实时监控环形数据缓冲区的异常,当所述环形数据缓冲区出现异常时,调整读指针及写指针,使得读数据及写数据可以顺利进行,避免了读进程与写进程同时进行时对环形数据缓冲区进行操作而造成的临界资源访问异常的问题 。保证了数据传输的效率,进一步提供了数据传输的精确度。
基于上述实施例,本发明还提供了一种用环形数据缓冲区读写批量数据的装置,如图5所示,包括:
写指针控制单元510、读指针控制单元520、指针调整单元530,其中,所述装置还可包括:定义单元501、列队建立单元502、缓冲区申请单元503及初始化单元504,具体地,所述指针调整单元530包括:第一判断模块531、第二判断模块532、调整控制模块533。
为了方便理解,下面详细描述本实施例的装置的工作原理:
定义单元501定义多个缓冲区,其中,所述缓冲区的个数与所述环形数据缓冲区的个数相等;具体地,所述多个缓冲区可用BUFFER_NUM表示,进一步地,定义例如定义#define BUFFER_NUM  8 或者 const int BUFFER _NUM = 8。接着列队建立单元502建立等待列队,具体地,启动外设,初始化外设,申明和建立一个读进程等待队列项,初始化其状态为休眠状态,将其加入到等待队列链表。缓冲区申请单元503申请至少一个缓冲区作为环形数据缓冲区,具体地,所述缓冲区的地址单元是连续的,而所述缓冲区的数量可根据数据的大小来设计,此处对此不作限制。接着初始化单元504初始化所述读指针、写指针的数值,使所述读指针、写指针的数值均为0。具体地,申请固定个数连续地址单元(单元大小根据需要定)作为缓冲区(buffer),定义和初始化读(rPtr)、写(wPtr)指针,使其指向buffer的头部。
具体地,本实施例中缓冲区个数=BUFFER_NUM,BUFFER_NUM为整数。但是 “BUFFER_NUM个连续地址单元”大小 = BUFFER_NUM  * 每个单元大小 ,每个单元大小可根据需要定义,比如说8192个字节。
本步骤中例如,定义所述读指针为rPtr,所述写指针为wPtr;并将所述rPtr和wPtr定义为整数或者指针类型;不管什么类型,在初始化时必须使二者指向buffer的头部(或者首地址)。
当将所述rPtr和wPtr定义为整数类型时,在初始化时使rPtr=wPtr = 0;当将所述rPtr和wPtr定义为指针类型时,在初始化时使rPtr和wPtr指向所述环形缓冲区的首地址。当然运行的过程中,为了保证数据的连续性和准确性,wPtr必须超前于rptr,且rptr不能追上wPtr。
需要说明的是,本实施例中,既有读数据,也有写数据的过程,开始的时候,首先进行的是写进程,当写进程进行到一定时候(至少已经写入一个单位的数据后),写进程唤醒等待队列的读数据进程,但是当写进程及读进程均启动之后,但是读数据与写数据之间没有严格的顺序,此处对此不作限制,下面分别详细说明读数据与写数据的具体过程:
写指针控制单元510接收到数据写请求时,控制写指针计算出在环形数据缓冲区当前要写入数据的环形缓冲区的起始位置,并读取外设数据,从该起始位置开始向所述环形缓冲区写入指定单位个数据,写完指定单位个数据后写指针加1。
进一步地,使用环形数据缓冲区首位置的零位置与写指针wPtr的数值做求和运算,所述求和运算不是数学上简单的相加,这与缓冲区buffer的数据结构有关系,缓冲区buffer数据结构不一样,算法也不一样,此处对此不作限制。
本实施例中,所述读指针或写指针的数值(即绝对位置)是指相对于所述环形数据缓冲区首地址零位置实际所表示的数值,所述绝对位置是指针当前的位置相对于所述环形数据缓冲区首地址零位置实际所表示的数值,其大小不定(可能会随着写入或读取次数一直增加);所述相对位置是指针当前的位置相对于所述环形数据缓冲区首地址的距离,其大小不会超过缓冲区的长度。另外,零地址也就是首地址。进一步地,当写进程进行到一定程度时(此处的程度是根据实际情况而定,即保证有数据可读的时候),所述写指针进程会向所述读指针发送唤醒信号,唤醒等待列队中的读指针读取数据,而读指针只能在被唤醒之后才能读取数据。
读指针控制单元520接收到唤醒信号后,触发所述读指针,第一判断模块531判断所述读指针的数值是否小于所述写指针的数值,如果是则向所述读指针控制单元520发送数据读请求,否则向所述读指针控制单元520返回无数据可读信息。当接收到数据读请求后,所述读指针控制单元520控制读指针计算当前需要读取的数据所在的位置,从该位置开始读取数据,读完后所述读指针的数值加1;其中,当有数据到来时,读指针计算出当前要读buffer(缓冲区)的起始位置(currReadPtr),如图6所示的读指针指示的当前读取的起始位置,然后读取外设数据,从该起始位置开始向buffer(缓冲区)读指定单位个数据如N(N一般设为1个Buffer的单位长度)个数据,读完后写指针加1。具体地,利用读指针的数值与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 1个单元,此时环形数据缓冲区不会溢出,同样是为了数据连贯性,这样可保证之前的数据不丢失。
需要说明的是,本实施例中,读数据及写数据的进程是可以多次在进行的,调整之后可能还会出现需要调整所述读指针及写指针来使得所述环形数据缓冲区处于正常状态,因此,所述调整控制模块533判断所述写指针的绝对位置等于或者超出所述读指针的绝对位置时,并且所述写指针的相对位置与所述读指针的相对位置相等时,向所述赋值模块534发送调整指令,所述赋值模块534接收到调整指令后,重新对所述读指针及写指针赋值,使得所述写指针的超前所述读指针,即保证所述写指针的相对位置等于所述读指针的相对位置,但是所述写指针的绝对位置超前或等于所述读指针的绝对位置。即尚未读取的数据不会在未读之前被新写入的数据覆盖,进而使得数据不连续。其中,如何对所述读指针及写指针赋值是根据具体情况而定,此处对此不作限制。
需要说明的是,无论读指针及写指针的数值怎么加或减,二者必须保持特定的数值和位置关系,因为写指针控制着当前数据的写入位置,而读指针控制着当前读取数据的位置,必须时刻保持有数据可读,同时要保证要及时读取数据,使得数据读取的连贯性,进而保证数据读取的准确性。
本实施例中,写进程在写完数据后会唤醒读进程;写进程和读进程是独立的进程,通过读写指针、队列等机制进行sync(同步),写过程可以由硬件本身提供的中断或者软件查询机制来控制,而读进程则需要由写进程控制,并不是每写一次就会去读,读是需要满足条件,但是写进程至少已经已经写入一个单位长度的数据后,才能启动读进程;有或者可能会出现写了3次了,读进程还在等待直到读条件满足,而读进程在完成一次读取操作后,需要由软件将其设为挂起状态也就是休眠状态,也就是读进程始终处于被动状态。
本实施例中,写进程与读进程分开执行,实时监控环形数据缓冲区的异常,当所述环形数据缓冲区出现异常时,调整读指针及写指针,使得读数据及写数据可以顺利进行,避免了读进程与写进程同时进行时对对环形数据缓冲区进行操作而造成的临界资源访问异常的问题。进一步提供了数据传输的精确度。
应当理解的是,本发明的应用不限于上述的举例,对本领域普通技术人员来说,可以根据上述说明加以改进或变换,所有这些改进和变换都应属于本发明所附权利要求的保护范围。

Claims (10)

1.一种用环形数据缓冲区读写批量数据的方法,其特征在于,包括步骤:
A、当有数据写请求时,写指针计算出在环形数据缓冲区当前要写入数据的起始位置,读取外设数据,从该起始位置开始向所述环形缓冲区写入数据,写完后所述写指针的数值加1;
B、当收到读数据请求时,读指针计算当前需要读取的数据所在的位置,从该位置开始读取数据,读完后所述读指针的数值加1;
C、当所述环形数据缓冲区出现异常,根据异常类型执行相应的操作,其中,所述异常的类型包括所述环形数据缓冲区溢出或为空;
所述步骤B之前还包括:
B1、判断是否收到唤醒信号,如果是,则转向步骤B2,否则返回等待唤醒信号;
B2、判断当前的读指针的绝对位置是否小于写指针的绝对位置,如果判断结果为是时,则进入步骤B,否则表示无数据可读,返回所述步骤B1;
所述步骤A中的写指针计算出在环形数据缓冲区当前要写入数据的起始位置的方法具体为:计算所述起始位置时,根据所述写指针的绝对位置与所述环形数据缓冲区的首地址做求和运算,计算出当前需写入数据的起始位置;
所述步骤C还包括:当所述环形缓冲区处于溢出状态时,调整写指针、读指针及读与写指针中的任意一种。
2.根据权利要求1所述用环形数据缓冲区读写批量数据的方法,其特征在于,所述步骤A之前还包括:
A1、定义多个缓冲区,其中,所述缓冲区的个数与所述环形数据缓冲区的个数相等;
A2、建立等待列队;
A3、申请至少一个缓冲区作为环形数据缓冲区,所述缓冲区的地址单元是连续的;
A4、初始化所述读指针、写指针的数值,使所述读指针、写指针的数值均为0。
3.根据权利要求1所述用环形数据缓冲区读写批量数据的方法,其特征在于,所述步骤C具体包括:
C1、当所述写指针的相对位置超出或等于所述读指针的相对位置,并且所述写指针的绝对位置超出所述读指针的绝对位置,则所述环形缓冲区溢出,发出溢出信号,并进入步骤C3;
C2、当所述写指针的相对位置等于所述读指针的相对位置,并且所述写指针的绝对位置与所述读指针的绝对位置相等,则所述环形数据缓冲区为空,则返回所述环形数据缓冲区为空的信号,并进入步骤C4;
C3、调整所述读指针及所述写指针的绝对位置,使得所述写指针超前所述读指针;
C4、读指针进入等待状态。
4.根据权利要求3所述用环形数据缓冲区读写批量数据的方法,其特征在于,所述步骤C3之后具体还包括:
当所述写指针的绝对位置等于或者超出所述读指针的绝对位置时,并且所述写指针的相对位置与所述读指针的相对位置相等时,分别重新对所述读指针及写指针进行调整,使得所述写指针超前所述读指针。
5.根据权利要求1至4任意一项所述用环形数据缓冲区读写批量数据的方法,其特征在于,所述读指针的绝对位置是指所述读指针相对于所述环形数据缓冲区首地址零位置实际所表示的数值;所述写指针的绝对位置是指所述写指针相对于所述环形数据缓冲区首地址零位置实际所表示的数值;
所述读指针的相对位置是指所述读指针当前的位置相对于所述环形数据缓冲区首地址的距离,所述写指针的相对位置是指所述写指针当前的位置相对于所述环形数据缓冲区首地址的距离。
6.一种用环形数据缓冲区读写批量数据的装置,其特征在于,包括:
写指针控制单元,当有数据写请求时,用于控制写指针计算出在环形数据缓冲区当前要写入数据的起始位置,读取外设数据,从该起始位置开始向所述环形缓冲区写入数据,写完后所述写指针的数值加1;
读指针控制单元,当收到读数据请求时,用于控制读指针计算当前需要读取的数据所在的位置,从该位置开始读取数据,读完后所述读指针的数值加1;
指针调整单元,当所述环形数据缓冲区出现异常,根据异常类型执行相应的操作,其中,所述异常的类型包括所述环形数据缓冲区溢出或为空;
所述写指针控制单元,还用于计算所述起始位置时,根据所述写指针的绝对位置与所述环形数据缓冲区的首地址做求和运算,计算出当前需写入数据的起始位置;
所述指针调整单元,还用于当所述环形缓冲区处于溢出状态时,调整写指针、读指针及读与写指针中的任意一种。
7.根据权利要求6所述用环形数据缓冲区读写批量数据的装置,其特征在于,其还包括:
定义单元,用于定义多个缓冲区,其中,所述缓冲区的个数与所述环形数据缓冲区的个数相等;
列队建立单元,用于建立等待列队;
缓冲区申请单元,用于申请至少一个缓冲区作为环形数据缓冲区,所述缓冲区的地址单元是连续的;
初始化单元,用于初始化所述读指针、写指针的数值,使所述读指针、写指针的数值均为0。
8.根据权利要求7所述用环形数据缓冲区读写批量数据的装置,其特征在于,所述指针调整单元包括:
第一判断模块,用于判断所述读指针是否收到唤醒信号,如果为是,则唤醒所述读指针,接着并判断当前的读指针的绝对位置是否小于写指针的绝对位置;
第二判断模块,用于判断所述环形数据缓冲区是否异常,根据异常类型向调整控制模块发送相对应的所述环形数据缓冲区异常信号,其中,所述异常信号包括所述环形数据缓冲区溢出信号或所述环形数据缓冲区为空信号;
调整控制模块,当接收到所述环形数据缓冲区溢出信号时,用于调整所述读指针及所述写指针的绝对位置,使得所述写指针超前所述读指针;或当接收到所述环形数据缓冲区为空信号时,用于控制所述读指针进入等待状态。
9.根据权利要求8所述用环形数据缓冲区读写批量数据的装置,其特征在于,
所述第二判断模块还用于再次判断所述写指针的绝对位置是否等于或者超出所述读指针的绝对位置,并且判断所述写指针的相对位置与所述读指针的相对位置是否相等;
所述指针调整单元还用于当所述写指针的绝对位置等于或超出所述读指针的绝对位置时,并且当所述写指针的相对位置等于所述读指针的相对位置时,分别重新对所述读指针及写指针进行调整,使得所述写指针超前所述读指针。
10.根据权利要求6至9任意一项所述用环形数据缓冲区读写批量数据的装置,其特征在于,
所述读指针的绝对位置是指所述读指针相对于所述环形数据缓冲区首地址零位置实际所表示的数值;所述写指针的绝对位置是指所述写指针相对于所述环形数据缓冲区首地址零位置实际所表示的数值;
所述读指针的相对位置是指所述读指针当前的位置相对于所述环形数据缓冲区首地址的距离,所述写指针的相对位置是指所述写指针当前的位置相对于所述环形数据缓冲区首地址的距离。
CN201110444367.9A 2011-12-27 2011-12-27 一种用环形数据缓冲区读写批量数据的方法及装置 Expired - Fee Related CN102591815B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201110444367.9A CN102591815B (zh) 2011-12-27 2011-12-27 一种用环形数据缓冲区读写批量数据的方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201110444367.9A CN102591815B (zh) 2011-12-27 2011-12-27 一种用环形数据缓冲区读写批量数据的方法及装置

Publications (2)

Publication Number Publication Date
CN102591815A CN102591815A (zh) 2012-07-18
CN102591815B true CN102591815B (zh) 2015-07-29

Family

ID=46480499

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201110444367.9A Expired - Fee Related CN102591815B (zh) 2011-12-27 2011-12-27 一种用环形数据缓冲区读写批量数据的方法及装置

Country Status (1)

Country Link
CN (1) CN102591815B (zh)

Families Citing this family (25)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103064679B (zh) * 2012-12-25 2015-07-15 北京航天测控技术有限公司 长时间连续dma传输的缓冲区管理的方法
CN104375952A (zh) * 2013-08-14 2015-02-25 南宁市跃龙科技有限公司 一种从环形缓冲区读取数据的方法
CN103530130B (zh) * 2013-10-28 2016-12-07 迈普通信技术股份有限公司 多核系统中实现多入多出队列的方法和设备
CN103581611A (zh) * 2013-11-19 2014-02-12 北京兆维电子(集团)有限责任公司 基于路由服务器音视频录制的实现方法及路由服务器
CN104899151B (zh) * 2015-02-02 2018-01-05 上海小蚁科技有限公司 内存数据读写方法及装置
CN106656870B (zh) * 2015-10-28 2020-04-17 中国科学院声学研究所 一种基于储存端口的二层交换机储存方法
CN107368374B (zh) * 2017-07-26 2019-08-06 广州路派电子科技有限公司 用于嵌入式系统基于同步机制下的环形数据缓冲实现方法
CN108089834B (zh) 2017-11-07 2021-04-30 潍坊歌尔电子有限公司 一种播放同步方法、装置和usb声卡
CN108563704A (zh) * 2018-03-26 2018-09-21 深圳市景阳信息技术有限公司 一种数据写入的方法、装置及设备
CN108768884A (zh) * 2018-04-27 2018-11-06 江苏中科芯核电子科技有限公司 一种基于环形缓冲区的无线通信数据处理方法
CN108897700A (zh) * 2018-06-26 2018-11-27 青岛海信宽带多媒体技术有限公司 一种环形缓存器的数据处理方法、装置及机顶盒
CN111435332B (zh) * 2019-01-14 2024-03-29 阿里巴巴集团控股有限公司 数据处理方法及设备
CN112148435B (zh) * 2019-06-28 2024-03-29 北京魔门塔科技有限公司 用于自动驾驶系统的确定目标模块调度策略的方法及装置
CN112765054B (zh) * 2019-11-01 2024-09-27 北京中科海网科技有限公司 一种基于fpga的高速数据采集系统及方法
CN112783421A (zh) * 2019-11-07 2021-05-11 北京京东尚科信息技术有限公司 一种基于环形缓冲区的异步消费方法和装置
CN111290709B (zh) * 2020-01-19 2022-12-06 成都中嵌自动化工程有限公司 一种可动态调整的环形缓冲区
CN111538607B (zh) * 2020-06-22 2020-10-20 北京翼辉信息技术有限公司 一种基于边界保护的消息通信方法及装置
CN111966498B (zh) * 2020-08-27 2023-08-25 南京电研电力自动化股份有限公司 一种配电房物联网网关数据快速处理方法、系统及存储介质
CN112506676B (zh) * 2020-12-02 2024-04-05 深圳市广和通无线股份有限公司 进程间的数据传输方法、计算机设备和存储介质
CN112882831A (zh) * 2021-02-04 2021-06-01 浙江大华技术股份有限公司 一种数据处理方法及装置
CN113138839B (zh) * 2021-04-23 2023-02-03 深圳市科思科技股份有限公司 环形队列缓冲区及其运行方法、计算机可读存储介质
CN115934023B (zh) * 2021-08-31 2024-06-18 华为技术有限公司 数据处理方法、数据处理装置以及相关设备
CN116107763B (zh) * 2023-04-12 2023-06-20 北京燧原智能科技有限公司 一种数据发送方法、装置、设备及存储介质
CN117422024B (zh) * 2023-12-14 2024-05-03 苏州元脑智能科技有限公司 数据位宽转换方法、装置、计算机设备及介质
CN117591451B (zh) * 2024-01-18 2024-05-14 天津七一二通信广播股份有限公司 一种cpu与fpga间循环缓冲通信方法及系统

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101526748A (zh) * 2009-01-13 2009-09-09 上海微电子装备有限公司 用于光刻对准数据检验的存储装置、方法和对准控制系统
CN101800867A (zh) * 2010-01-19 2010-08-11 深圳市同洲电子股份有限公司 一种实现环形缓冲区的方法、装置及数字电视接收终端

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR101606453B1 (ko) * 2009-05-13 2016-04-01 삼성전자주식회사 비휘발성 데이터 저장 장치의 읽기 및 쓰기 성능 향상 방법

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101526748A (zh) * 2009-01-13 2009-09-09 上海微电子装备有限公司 用于光刻对准数据检验的存储装置、方法和对准控制系统
CN101800867A (zh) * 2010-01-19 2010-08-11 深圳市同洲电子股份有限公司 一种实现环形缓冲区的方法、装置及数字电视接收终端

Also Published As

Publication number Publication date
CN102591815A (zh) 2012-07-18

Similar Documents

Publication Publication Date Title
CN102591815B (zh) 一种用环形数据缓冲区读写批量数据的方法及装置
EP2473914B1 (en) Hardware-based scheduling of graphics processor unit (gpu) work
JP5149311B2 (ja) オン−デマンド・マルチ−スレッド・マルチメディア・プロセッサ
US9659342B2 (en) Mid command buffer preemption for graphics workloads
US8743131B2 (en) Course grain command buffer
EP2580669B1 (en) Multithread application-aware memory scheduling scheme for multi-core processors
EP2652615B1 (en) Graphics compute process scheduling
EP2791795B1 (en) Policies for shader resource allocation in a shader core
US10242420B2 (en) Preemptive context switching of processes on an accelerated processing device (APD) based on time quanta
US8963933B2 (en) Method for urgency-based preemption of a process
EP2652614B1 (en) Graphics processing dispatch from user mode
US11822958B2 (en) Method and a device for data transmission between an internal memory of a system-on-chip and an external memory
US8892819B2 (en) Multi-core system and external input/output bus control method
US7565659B2 (en) Light weight context switching
Hartmann et al. Gpuart-an application-based limited preemptive gpu real-time scheduler for embedded systems
EP4386554A1 (en) Instruction distribution method and device for multithreaded processor, and storage medium
CN105335130A (zh) 一种处理器及其处理任务的方法
US20120188259A1 (en) Mechanisms for Enabling Task Scheduling
CN103262039A (zh) 用于处理装置的同步操作的方法和系统
US9690619B2 (en) Thread processing method and thread processing system for setting for each thread priority level of access right to access shared memory
CN101349975B (zh) 一种在嵌入式操作系统上实现中断底半部机制的方法及装置
US20130160019A1 (en) Method for Resuming an APD Wavefront in Which a Subset of Elements Have Faulted
CN112114967B (zh) 一种基于服务优先级的gpu资源预留方法
WO2013085794A1 (en) Method and apparatus for servicing page fault exceptions
US20030005185A1 (en) System and method for efficiently performing data transfer operations

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: 20150729