一种无累计误差的定时器控制方法

文档序号:6507916阅读:466来源:国知局
一种无累计误差的定时器控制方法
【专利摘要】本发明公开一种无累计误差的定时器控制方法,该方法能够让多定时器在长时间执行后还能够保持精确的定时功能,而不会产生定时误差。该方法中,首先,把定时器管理和回调执行分开处理,使用消息队列的方式来异步通知。使得消除回调函数执行所带来的函数执行时间开销,消除回调误差。其次,使用系统的相对时间来进行定时器的时间管理,消除了定时器本身指令执行造成的时间开销。系统相对时间指的是系统从开机到现在所经过的时间,这个时间不会随系统时间的变化而变化,因此可以用来准确的计算时间。本发明应用于计算机软件或者通信领域中定时器的累计误差的消除。
【专利说明】一种无累计误差的定时器控制方法
【技术领域】
[0001]本发明涉及一种在计算机软件或者通信领域中无累计误差的定时器控制方法。
【背景技术】
[0002]在软件开发或者通信领域中经常有用到定时执行某项操作的功能,就是要在固定时间间隔去执行固定的操作。因此要用到定时器技术。
[0003]为了提高软件的可移植性,也为了能够同时实现多定时器的管理,因此定时器的实现一般都是程序自己来组织和管理,形成一个定时器管理器。不过当前的一些定时器都存在着累计误差,长时间定时将导致精度降低。累计误差基本都是出现以下两种情况:
1、在定时器管理器中注册一个定时器,然后定时查询该定时器的时间是否到达,当到达后就调用该定时器的回调函数执行相应的操作。然后再定时判断。
[0004]传统的单个定时器的流程如下图1所示:以Is定时为例,从O秒开始定时。由图1可以看出,回调函数的执行需要时间。如果要求I秒钟定时一次,100秒就需要执行100次的回调函数,可是由于回调函数需要有执行时间,累计下来后,100秒实际只能执行99次的回调函数,达不到要求,就造成定时误差、精度不够的问题。
[0005]2、定时器管理器中本身指令执行也会造成时间开销,这样也会造成累计误差。
[0006]为此,现有技术中给出了一些对定时器的累计误差进行校正的方案。例如申请号为200310112261.4的发明专利,公开了一种校正实时定时器之方法,其首先读取平均校正量、系统目前时间、以及前次校正时间,再根据公式得到累计误差值,此公式包含平均校正量、系统目前时间以及前次校正时间,再将前次校正时间设定并存储为系统目前时间,接着利用累计误差值调整系统目前时间,最后储存系统目前时间。该发明的主要目的是校正系统的时间,而系统时间的误差是由系统关机到下次开机之间造成,因为在关机的时候使用的是系统的实时时钟,由于硬件的原理才导致不准了。因此,该发明的主要目的是校正由于硬件导致的误差,对于软件运行中由于回调函数的执行时间而导致软件方面的定时器误差则没有提到。
[0007]再例如申请号为200610147438.8的发明专利,其公开了一种无积累误差和自适应定时器实现方法,该发明包括以下过程:获取当前的初始时间值,执行次数m清零;获取当前系统时间Tl,将其作为本次执行的起始时间;执行任务,执行次数m增加I ;用执行周期TlO乘以执行次数m,得到理论执行总时间T4 ;用当前的系统时间值T50,减去初始时间值T0,得到实际的执行总时间T5 ;用理论执行总时间T4减去实际的执行总时间T5,得到需要休眠的总时间T6 ;如果需要休眠的总时间大于0,执行休眠,休眠时间结束后唤醒,然后判断是否需要修改执行周期,如果是,则修改执行周期,重启定时器。该发明可以通过类似积分的方式进行补偿,从而实现消除累计误差的目的,并消除单次的大扰动,且执行周期可动态调节。该发明具有以下不足:1、使用系统时间,如果某一时刻系统时间被改变了,则会使定时器混乱,无法正常工作,即无精度可言。2、该发明没有说明如何调用执行函数执行任务,就是定时器的回调函数。只说明由一个线程或进程执行。这样可能会造成执行的实时性问题,就是定时时间到了,可是却没有立马去执行回调函数,造成定时精度下降问题。3、定时器本身执行的指令所需的耗时没有计算在内,只是用估算的方式。这样就无法精确计算定时器本身指令执行的时间,因为不同的CPU频率不同,执行一条指令的时间也跟着不同。而定时器本身指令的执行时间也会造成长时间定时的累计误差。
[0008]在例如申请号200710163912.0的发明专利,公开了一种提高定时器精度的方法,该方法包括以下过程:对比定时器计时参考点与相应的系统时间参考点所获差值,休眠补偿休眠时长且调整下一定时器计时周期休眠时长。该发明虽然在一定程度上提高了定时器精度,能避免实际定时器计时周期与理论定时器计时周期之间存在的误差随着循环次数增加而逐渐累积的问题,但是其具体方法是利用定时器的下次周期来补偿这一次的定时误差,同样也有如下几个不足:1、使用系统时间,如果某一时刻系统时间被改变了,则会使定时器混乱,无法正常工作,即无精度可言。2、按该发明的描述,每一次的定时都要进行补偿,可见定时器本身的误差就很大,连单次定时都不准。假使有个定时功能需要一秒钟执行一次操作,由于该定时器使用补偿或者删减的操作,可能导致一秒钟内执行两次操作,可能在
0.1秒和0.9秒的时间内都执行到了,可见会影响定时器的精度。3、该发明未说明如何调用执行函数执行任务,就是定时器的回调函数。假使定时周期为I秒,而回调函数执行了 1.5秒。那么就可能导致其中的一个定时执行操作丢掉了,导致定时器错误问题。
[0009]因此,申请号为200610147438.8的发明专利以及申请号200710163912.0的发明专利,虽然涉及到软件方面的定时器误差,为消除定时器误差和提高定时精度提供了一定的方案,但是具有上述种种不足,且效果不是很理想,而且步骤麻烦,不具有很好的实用性。

【发明内容】

[0010]因此,针对上述的问题,本发明提出一种无累计误差的定时器控制方法,消除现有技术中的不足;能够让多定时器在长时间执彳丁后还能够保持精确的定时功能,而不会广生定时误差。
[0011]为了解决上述技术问题,本发明所采用的思路是,首先,把定时器管理和回调执行分开处理,使用消息队列的方式来异步通知。使得消除回调函数执行所带来的函数执行时间开销,消除回调误差。其次,使用系统的相对时间来进行定时器的时间管理,消除了定时器本身指令执行造成的时间开销。系统相对时间指的是系统从开机到现在所经过的时间,这个时间不会随系统时间的变化而变化,因此可以用来准确的计算时间。
[0012]具体的,本发明所采用的技术方案是,一种无累计误差的定时器控制方法,包括定时器的管理步骤,以及定时器的定时到时之后的处理步骤,具体的,所述定时器的管理步骤包括:
步骤Al:建立定时器管理器,用于管理定时器信息;建立消息队列,用来传递定时器信息;该定时器信息包括定时器ID、定时时间T、定时器回调函数指针、定时器回调函数参数指针;
步骤A2:向定时器管理器增加一定时器,为该定时器设定初始时间TO,TO为此时系统的相对时间,相对时间是指系统从开机到此时所经过的时间;
步骤A3:定时器管理器检测其内是否有定时器存在,如果没有定时器存在,则循环执行步骤A3 ;如果有定时器存在,则取出目前指示器所指向的定时器,并把指示器指向下一个定时器,如果指示器已经指向了最后一个定时器,则把指示器指向第一个定时器;其中,为了提高读取速度,所述指示器由指针实现;
步骤A4:判断定时器是否到时,具体是,获取系统当前的相对时间Tl,如果Tl-TO等于T或者大于T,则把该定时器信息压入消息队列,并转至步骤A5 ;如果Tl-TO小于T,则跳到步骤A3;
步骤A5:调整定时器的初始时间T0,令Τ0=Τ0+Τ,即把定时器的开始时间加上定时时间作为定时器的新一轮的开始时间,并返回步骤A3继续执行。
[0013]定时器的定时到时之后的处理步骤,也即回调函数的执行步骤,具体包括:
步骤B1:读取消息队列的内容,如果消息队列内有内容,则读取消息队列内容;优选的,读取消息队列的内容采用阻塞读取的方式;
步骤Β2:获取消息队列内容中的相关定时器的信息;消息列队中可以存放多个数据,可是一次只能读取一个,读完一个之后,如果队列里还有数据,就继续读取。
[0014]步骤Β3:取出定时器中的回调函数指针和回调函数参数指针;
步骤Β4:执行回调函数,返回步骤BI。
[0015]上述过程中,定时器管理器开始获取系统的当前的相对时间,如果当前时间与开始时间之差等于定时时间,则把相应的定时器压入消息队列。使用了消息队列这一通讯机制,使得定时器管理中可以不用去执行定时器的回调函数,这样就消除回调时间开销,提高了定时精度。把定时器的开始时间加上定时时间作为定时器的新一轮的开始时间。结合系统相对时间的稳定性,消除定时器管理器的指令执行带来的时间开销。
[0016]结合以上两点,可以做到定时器的无累计误差的控制。使得定时器在长时间执行后依然保持高度的准确性和稳定性。
[0017]本发明的方案可以做到对多定时器的同一控制,且能够精确的对定时器管理控制,使得定时器达到无累计误差的效果,使得定时器在长时间执行后依然保持高度的准确性和稳定性。
[0018]本发明采用上述方法,与现有技术相比,其在消除定时误差方面是绝对的,可实现长时间的定时没有误差,而且依旧精确。加上消息队列机制,使得回调函数可及时执行,又不影响定时精度。因此本发明在效果上要好于现有技术中的方法。另外,本发明的方法简单,构思巧妙,容易实现,具有很好的实用性。
【专利附图】

【附图说明】
[0019]图1为传统的定时器流程图;
图2为本发明的消息队列异步通知示意图;
图3为本发明的定时器流程图;
图4为本发明的回调函数执行图。
【具体实施方式】
[0020]现结合附图和【具体实施方式】对本发明进一步说明。
[0021]本发明主要目的是提出一种无累计误差的定时器控制方法,能够让多定时器在长时间执行后还能够保持精确的定时功能,而不会产生定时误差。其主要使用以下两点思路。首先,参照图2,把定时器管理和回调执行分开处理,使用消息队列的方式来异步通知。使得消除回调函数执行所带来的函数执行时间开销,消除回调误差。其次,使用系统的相对时间来进行定时器的时间管理,消除了定时器本身指令执行造成的时间开销。系统相对时间指的是系统从开机到现在所经过的时间,这个时间不会随系统时间的变化而变化,因此可以用来准确的计算时间。
[0022]本发明的具体实施如下:首先设计一个定时器管理器,该定时器管理器负责定时器的管理,可支持多个定时器,进行定时器的添加、删除操作,本实施例中,使用动态链表来实现,这样可以有效的提高定时器的执行效率。参照图3,定时器流程包括:
步骤1:向动态链表(即定时器管理器)添加一个定时器,建立消息队列,用来传递定时器信息;添加的定时器的信息包括定时器ID、定时时间T、定时器回调函数指针、以及定时器回调函数参数指针;该消息队列用来把定时管理器和回调函数分开执行; 步骤2:将该定时器加入动态链表末尾,并为新添加的定时器设定初始时间TO,TO就是这时系统的相对时间(系统从开机到此时所经过的时间);
步骤3:检测动态链表内是否有定时器存在,如果动态链表中有定时器存在,则取出动态链表中的指示器所指向的定时器,并把指示器指向下一个定时器,如果指示器已经指向了最后一个定时器,则把指示器指向第一个定时器;如果动态链表内没有定时器,则循环执行该步骤3,即动态链表循环等待检查,直到有定时器来临;其中,指示器的作用只是用来指示当前执行的是哪一个定时器。因为定时管理器中可能有很多个定时器,为了让每个定时器都能执行到。指示器可以是某个值,比如1、2、3....等等,指向管理器中排好队的定时器;本实施例中,为了提高读取速度,该指示器采用指针实现。指示器指到当前的定时器或者下一个定时器,可根据定时管理器的具体设置来进行。指向下一个定时器是为了让定时管理器中的定时器都能够被执行到。
[0023]步骤4:判断步骤3中从动态链表取出来定时器是否到时,具体是,获取系统当前的相对时间Tl,如果Τ1-?ΧΚΤ,则不做处理,并返回步骤3 ;如果Tl-TO等于T或者大于T,则把该定时器信息压入消息队列;
步骤5:调整定时器的初始时间T0,令Τ0=Τ0+Τ,即把定时器的开始时间加上定时时间作为定时器的新一轮的开始时间,并返回步骤3继续执行。
[0024]上半部分(步骤1-步骤5)完成了定时器的管理,下半部分就要完成定时到时之后的处理,就是回调函数的执行,参见图4,其具体步骤包括:
步骤6:阻塞读取消息队列的内容;阻塞读取就是读消息的一种。只不过阻塞读取是说如果消息列队里有内容的话,立马就可以读取。还有其他的读取方式,比如循环查询读取,这样的效率会慢些,因为只有到去查询的时候才知道有没有数据。而阻塞读取就比较快,只要有数据就可以立马知道,然后进行读取;
步骤7:如果消息队列内有内容,读取消息队列内容;
步骤8:获取消息队列内容中的相关定时器的信息;消息列队中可以存放多个数据,可是一次只能读取一个,读完一个之后,如果队列里还有数据,就继续读取;
步骤9:取出定时器中的回调函数指针和回调函数参数指针;
步骤10:执行回调函数,返回步骤6。
[0025]综上所示,定时器管理器开始获取系统的当前相对时间,如果当前时间与开始时间之差等于定时时间,则把相应的定时器压入消息队列。使用了消息队列这一通讯机制,使得定时器管理中可以不用去执行定时器的回调函数,这样就消除回调时间开销,提高了定时精度。把定时器的开始时间加上定时时间作为定时器的新一轮的开始时间。结合系统相对时间的稳定性,消除定时器管理器的指令执行带来的时间开销。结合以上两点,可以做到定时器的无累计误差的控制。使得定时器在长时间执行后依然保持高度的准确性和稳定性。该方案可以做到对多定时器的同一控制,且能够精确的对定时器管理控制,使得定时器达到无累计误差的效果,使得定时器在长时间执行后依然保持高度的准确性和稳定性。
[0026]尽管结合优选实施方案具体展示和介绍了本发明,但所属领域的技术人员应该明白,在不脱离所附权利要求书所限定的本发明的精神和范围内,在形式上和细节上可以对本发明做出各种变化,均为本发明的保护范围。
【权利要求】
1.一种无累计误差的定时器控制方法,其特征在于:包括定时器的管理步骤,以及定时器的定时到时之后的处理步骤,具体的,定时器的管理步骤包括: 步骤Al:建立定时器管理器,用于管理定时器信息;建立消息队列,用来传递定时器信息;该定时器信息包括定时器ID、定时时间T、定时器回调函数指针、定时器回调函数参数指针; 步骤A2:向定时器管理器增加一定时器,为该定时器设定初始时间TO,TO为此时系统的相对时间,相对时间是指系统从开机到此时所经过的时间; 步骤A3:定时器管理器检测其内是否有定时器存在,如果没有定时器存在,则循环执行步骤A3 ;如果有定时器存在,则取出目前指示器所指向的定时器,并把指示器指向下一个定时器,如果指示器已经指向了最后一个定时器,则把指示器指向第一个定时器; 步骤A4:判断定时器是否到时,具体是,获取系统当前的相对时间Tl,如果Tl-TO等于T或者大于T,则把该定时器信息压入消息队列,并转至步骤A5 ;如果Tl-TO小于T,则跳到步骤A3 ; 步骤A5:调整定时器的初始时间T0,令Τ0=Τ0+Τ,即把定时器的开始时间加上定时时间作为定时器的新一轮的开始时间,并返回步骤A3继续执行; 所述定时器的定时到时之后的处理步骤,具体包括: 步骤B1:读取消息队列的内容,如果消息队列内有内容,则读取消息队列内容; 步骤Β2:获取消息队列内容中的相关定时器的信息; 步骤Β3:取出定时器中的回调函数指针和回调函数参数指针; 步骤Β4:执行回调函数,返回步骤BI。
2.根据权利要求1所述的无累计误差的定时器控制方法,其特征在于:步骤Al中,该定时器管理器使用动态链表来实现。
3.根据权利要求1所述的无累计误差的定时器控制方法,其特征在于:步骤A3中,所述指示器由指针实现。
4.根据权利要求1所述的无累计误差的定时器控制方法,其特征在于:步骤BI中,读取消息队列的内容是采用阻塞读取的方式。
【文档编号】G06F11/28GK103455402SQ201310357952
【公开日】2013年12月18日 申请日期:2013年8月16日 优先权日:2013年8月16日
【发明者】陈华云, 郑振贵, 韦昌荣, 郑福弟, 刘伟峰, 黄杭星 申请人:厦门雅迅网络股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1