一种从环形缓冲区读取数据的方法

文档序号:6507715阅读:304来源:国知局
一种从环形缓冲区读取数据的方法
【专利摘要】本发明公开一种从环形缓冲区读取数据的方法,其特征在于,包括步骤:定义用于存入数据时对环形缓冲区进行标记的存入指针以及用于在读出数据时对环形缓冲区进行标记的读出指针;设置一个触发产生中断以从环形缓冲区的一个存储单元中读出数据的定时器;当判断存入指针所指向的下一个存储单元与读出指针所指向的存储单元相同时,将触发读出数据的定时器的定时时间缩短。本发明通过动态调整环形缓冲区中数据的读出频率,确保数据存入与数据读出大致同步,既可以防止写入数据溢出丢失又可以防止读出为空或无效的数据,从而可以提高串口通信的可靠性。
【专利说明】一种从环形缓冲区读取数据的方法

【技术领域】
[0001]本发明涉及数据读取控制技术,尤其是涉及一种从环形缓冲区读取数据的方法。

【背景技术】
[0002]环形缓冲区(Ring Buffer)是生产者和消费者模型中常用的数据结构。生产者将数据放入数组的尾端,而消费者从数组的另一端移走数据,当达到数组的尾部时,生产者绕回到数组的头部。如果只有一个生产者和一个消费者,那么就可以做到免锁访问环形缓冲区。写入索引只允许生产者访问并修改,只要写入者在更新索引之前将新的值保存到缓冲区中,则读者将始终看到一致的数据结构。同理,读取索引也只允许消费者访问并修改。
[0003]现有单片机串口缓冲区算法中,针对缓冲区数据的读取一直都采用等同间隔时间访问的方式。当缓冲区生产者(数据进入)与消费者(对缓冲区数据读取)的速度相等时,这是理想的情况。此时生产者生产的和消费者支出平衡。当生产者速度加快,而消费者速度不变,此时略有剩余,而因为有环形缓冲区存在,此时还不会造成数据拥堵。当生产者速度快到消费者消费不及时,此时会产生数据拥堵。而当生产者生产速度变慢时,消费者的等间隔访问时又不一定都会有生产产出,造成消费者访问浪费,浪费了软件循环时间负荷的浪费。当然上述结果可能不会出现,前提是消费者的时间间隔要足够小以满足最大通信负荷下仍能保持一定的消费,或者所定义的数据缓冲区存储空间足够大。


【发明内容】

[0004]本发明提出一种从环形缓冲区读取数据的方法,以解决目前环形缓冲区的数据存入与数据读取不同步导致数据容易丢失的技术问题。
[0005]本发明采用如下技术方案实现:一种从环形缓冲区读取数据的方法,其包括步骤:
[0006]在单片机的存储器中设定环形缓冲区,并在环形缓冲区中设定若干个分别每次写入数据或读出数据对应的存储单元;
[0007]定义用于存入数据时对环形缓冲区进行标记的存入指针以及用于在读出数据时对环形缓冲区进行标记的读出指针;
[0008]设置一个触发产生中断以从环形缓冲区的一个存储单元中读出数据的定时器;
[0009]当判断存入指针所指向的下一个存储单元与读出指针所指向的存储单元相同时,将触发读出数据的定时器的定时时间缩短。
[0010]其中,所述一种从环形缓冲区读取数据的方法还包括步骤:判断读出指针所指向的下一个存储单元是否为空或未有新的数据,若是,将触发读出数据的定时器的定时时间延长。
[0011]其中,所述一种从环形缓冲区读取数据的方法还包括步骤:预设该定时器的初始定时时间Ttl,以及定时时间的调整幅度!\。
[0012]其中,将定时器的当前定时时间减去调整幅度Tl作为新的定时时间,以此使定时器的定时时间缩短。
[0013]其中,将定时器的当前定时时间加上调整幅度Tl作为新的定时时间,以此使定时器的定时时间延长。
[0014]与现有技术相比,本发明具有如下有益效果:
[0015]本发明通过动态调整环形缓冲区中数据的读出频率,确保数据存入与数据读出大致同步,既可以防止写入数据溢出丢失又可以防止读出为空或无效的数据,从而可以提高串口通信的可靠性。

【专利附图】

【附图说明】
[0016]图1是环形缓冲区的示意图;
[0017]图2是本发明一个实施例的流程示意图。

【具体实施方式】
[0018]本发明实现对所定义串口数据缓冲区数据的读取,实现通讯繁忙时与通讯闲时扫描次频率的改变。本法利用定时器定时读取缓冲区数据,而且在通讯忙时,会使定时器定时时间缩短,单位时间内对数据缓冲区访问次数增加,保证及时读取通讯的数据。在通讯较为空闲时,定时器定时时间将会增加,单位时间内对缓冲区访问次数减少,从而达到优化软件周期负荷的目的。
[0019]如图1所示,定义一个缓冲区数组Α[0,η],长度n+1是可按实际定义。η为大于I的自然数。接收缓冲区数组中每一个元素对应环形缓冲区中每次读写的存储单元。定义数组的同时,又定义了存入指针和读出指针,存入指针是用在当存入数据时对缓冲区空间的标记,读出指针是用在当读出数据时对缓冲区空间的标记。通俗的说法就是存入指针指向的是我所填到的具体空间,读出指针指向的是我所读出的空间。两个指针初始时都指向数组的第I个空间(O下标)。
[0020]当定时器触发,此时是对缓冲区数据的读取和处理过程。从读出指针指向的缓冲区具体空间,数据被读出,依次读取,直到数组缓冲区最后一个空间,指针转向第一个空间,继续读取,依次下去,对缓冲区空间的访问形成了一个环形循环。当数据填至存入指针指向和读出指针指向一致时,说明存入缓冲区已经满,若再存入,因为读出指针位向前移动(还没有读取前方数据),就会导致数据覆盖,导致数据被破坏,如果不存入,则数据会溢出而丢失。
[0021]结合图2所示,在本发明一个实施例中,通过动态调整读取数据的周期来防止数据被覆盖或数据溢出。具体来说,本实施例包括如下实现步骤:
[0022]步骤S1、在单片机的存储器中设定环形缓冲区,定义一个缓冲区数组Α[0,η],η为大于I的自然数。接收缓冲区数组中每一个元素Α0、Al…和An分别对应环形缓冲区中每次读写的存储单元。
[0023]步骤S2、定义存入指针和读出指针,存入指针是用在存入数据时对环形缓冲区的标记,读出指针是用在读出数据时对环形缓冲区的标记。
[0024]在初始状态下,存入指针和读出指针均指向缓冲区数组[0,η]中编号为O的存储单元。
[0025]步骤S3、设置一个触发读出数据的定时器,在定时到时,产生中断从环形缓冲区读取数据,并预设该定时器的初始定时时间Ttl,以及定时时间的调整幅度!\。
[0026]步骤S4、判断存入指针所指向的下一个存储单元是否为一个未读出数据的存储单元,若是,则转入步骤S5,否则返回步骤S4。
[0027]其中,由于缓冲区数组[0,n]中包含从O?η的n+1连个编号连续的存储单元,因此,当存入指针加I大于或等于读出指针时,就认为存入指针所指向的下一个存储单元为未读出数据的存储单元。
[0028]步骤S5、将触发读出数据的定时器的定时时间缩短,即当前定时时间T (当前定时时间也许是初始定时时间Ttl)减去预设的调整幅度1\。通过缩短定时器的定时时间来增大读出数据的频率,从而加快读出数据。
[0029]步骤S6、判断读出指针所指向的下一个存储单元是否为空或未有新的数据,若是,则转入步骤S7,否则返回步骤S6。
[0030]当读出入指针加I大于或等于存入指针时,就认为读出指针所指向的下一个为空或未有新的数据。
[0031]步骤S7、将触发读出数据的定时器的定时时间延长,即当前定时时间T (当前定时时间也许是初始定时时间Ttl)加上预设的调整幅度1\。通过延长定时器的定时时间来降低读出数据的频率,从而降低读出数据的频率,以确保数据存入与数据读出大致同步。
[0032]比如,在实际的单片机串口通信中,单片机与上位PC机通信,PC机使用调试助手发送。对缓冲区读取的间隔依次定义为每1ms、10ms、100ms、200ms和500ms对缓冲区进行读取访问。PC上位机未对单片机发送数据,此时对缓冲区的读取间隔为500ms,当PC机利用串口助手以一定间隔发送数据,单片机会从Ims间隔扫描,通过判断,会从Ims跳到相应档位对缓冲区进行扫描。
[0033]以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
【权利要求】
1.一种从环形缓冲区读取数据的方法,其特征在于,包括步骤: 在单片机的存储器中设定环形缓冲区,并在环形缓冲区中设定若干个分别每次写入数据或读出数据对应的存储单元; 定义用于存入数据时对环形缓冲区进行标记的存入指针以及用于在读出数据时对环形缓冲区进行标记的读出指针; 设置一个触发产生中断以从环形缓冲区的一个存储单元中读出数据的定时器; 当判断存入指针所指向的下一个存储单元与读出指针所指向的存储单元相同时,将触发读出数据的定时器的定时时间缩短。
2.根据权利要求1所述一种从环形缓冲区读取数据的方法,其特征在于,还包括步骤:判断读出指针所指向的下一个存储单元是否为空或未有新的数据,若是,将触发读出数据的定时器的定时时间延长。
3.根据权利要求1或2所述一种从环形缓冲区读取数据的方法,其特征在于,还包括步骤:预设该定时器的初始定时时间Ttl,以及定时时间的调整幅度!\。
4.根据权利要求3所述一种从环形缓冲区读取数据的方法,其特征在于,将定时器的当前定时时间减去调整幅度Tl作为新的定时时间,以此使定时器的定时时间缩短。
5.根据权利要求3所述一种从环形缓冲区读取数据的方法,其特征在于,将定时器的当前定时时间加上调整幅度Tl作为新的定时时间,以此使定时器的定时时间延长。
【文档编号】G06F3/06GK104375952SQ201310352488
【公开日】2015年2月25日 申请日期:2013年8月14日 优先权日:2013年8月14日
【发明者】韦云青 申请人:南宁市跃龙科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1