发明内容
有鉴于此,本发明提供一种嵌入式系统及其计时方法,能够在不增加实时时钟电路的基础上实现嵌入式系统的精确计时。
为解决上述问题,本发明提供一种嵌入式系统,包括:
时间校准模块,用于获取系统的校准时间;
时钟电路,用于产生时钟信号;
计时器,用于接收所述时钟信号,并根据接收到的所述时钟信号的数量进行计数,得到一计数数值,在所述计数数值达到预设数值时,生成一中断事件通知,并获取所述计数数值达到预设数值所需的时长;
处理器,用于在接收到所述中断事件通知后,执行中断服务程序,所述执行中断服务程序包括:统计所述中断服务程序的执行次数,并根据所述时长、所述执行次数以及所述校准时间,计算系统当前时间。
可选的,所述计时器还包括:
第一计时模块,用于在每接收到一所述时钟信号时,将所述计数数值加一,并获取所述计数数值从所述计时器的初始值递增计数到第一预设数值所需的时长;或
第二计时模块,用于在每接收到一所述时钟信号时,将所述计数数值减一,并获取所述计数数值从所述初始值递减计数到第二预设数值所需的时长;
可选的,所述处理器还包括:
计时器重置模块,用于在执行所述中断服务程序时,重置所述计时器的初始值。
可选的,所述处理器还包括:
误差获取模块,用于获取从接收到所述中断事件通知至重置所述计时器的初始值之间所述计时器的计数数值,作为误差值,并计算所述误差值与所述初始值的和值;
其中,所述计时器重置模块,还用于将所述和值作为所述计时器的初始值,并重置所述计时器的初始值。
本发明还提供一种嵌入式系统的计时方法,包括:
接收时钟电路产生的时钟信号,并采用计时器根据接收到的所述时钟信号的数量进行计数,得到一计数数值,在所述计数数值达到预设数值时,生成一中断事件通知;
获取所述计数数值达到预设数值所需的时长;
获取系统的校准时间;
在接收到所述中断事件通知后,执行中断服务程序,所述执行中断服务程序包括:统计所述中断服务程序的执行次数,并根据所述时长、所述执行次数以及所述校准时间,计算系统当前时间。
可选的,所述根据接收到的所述时钟信号的数量进行计数,得到一计数数值的步骤之前还包括:
为计数数值设置一初始值;
所述根据接收到的所述时钟信号的数量进行计数,得到一计数数值的步骤包括:
在每接收到一所述时钟信号时,将所述计数数值加一,并获取所述计数数值从所述初始值递增计数到第一预设数值所需的时长;或
在每接收到一所述时钟信号时,将所述计数数值减一,并获取所述计数数值从所述初始值递减计数到第二预设数值所需的时长;
可选的,所述计数数值从所述初始值递增计数到第一预设数值所需的时长的计算公式如下:
δt=(L1-pri)*T
其中,δt为计数数值从所述初始值递增计数到第一预设数值所需的时长,pri为所述初始值,L1为所述第一预设阈值,T为时钟周期;
所述计数数值从所述初始值递减计数到第二预设数值所需的时长的计算公式如下:
δt=(pri-L2)*T
其中,δt为计数数值从所述初始值递减计数到第二预设数值所需的时长,pri为所述初始值,L2为所述第二预设阈值,T为时钟周期。
可选的,所述执行中断服务程序的步骤还包括:
重置所述计时器的初始值。
可选的,所述重置所述计时器的初始值的步骤包括:
获取从接收到所述中断事件通知至重置所述计时器的初始值之间的所述计时器的计数数值,作为误差值,并计算所述误差值与所述初始值的和值;
将所述和值作为所述计时器的初始值,并重置所述计时器的初始值。
可选的,所述计数数值包括高位计数段和低位计数段,所述将所述和值作为所述计时器的初始值,并重置所述计时器的初始值的步骤包括:
将所述和值作为所述计时器的初始值,仅重置所述计时器的初始值的高位计数段的值。
本发明具有以下有益效果:
在实现精确计时的同时,不需要增加硬件设计的成本,不需辅助的电路设计,只需借助计时器通过软件的方式完成,不会引入任何的时间误差,并且可完全避免处理器执行程序指令用时所带来的时间累积误差。
具体实施方式
下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。
如图1所示为本发明实施例的嵌入式系统的一结构示意图,所述嵌入式系统包括:
时间校准模块101,用于获取系统的校准时间;时钟电路102,用于产生时钟信号;
计时器103,用于接收所述时钟电路产生的时钟信号,并根据接收到的所述时钟信号的数量进行计数,得到一计数数值,在所述计数数值达到预设数值时,生成一中断事件通知,并获取所述计数数值达到预设数值所需的时长;
处理器104,用于在接收到所述中断通知事件后,执行中断服务程序,所述执行中断服务程序包括:统计所述中断执行程序的执行次数,并根据所述时长、所述执行次数以及所述系统的校准时间,计算系统当前时间。
下面对上述各模块的结构和工作原理进行详细说明。
(1)时间校准模块
本发明实施例中,可以在嵌入式系统运行后的任意时刻,通过时间校准模块101对系统时间进行校准,得到系统的校准时间。例如在系统初始化后进行,或者在计时器初始化后进行。
此外,所述时间校准模块101可以通过多种方式对系统时间进行校准,例如,通过提供一人机交互界面由用户输入时间,或者,通过连接其他系统通过私有或公用协议完成系统时间的同步和校准,例如通过NTP(NetworkTimeProtocol,网络时间协议)协议对系统时间进行校准。
(2)时钟电路
时钟电路102中可以包括一时钟源和一震荡电路,所述时钟源可以是一石英晶体或其他替代元件,所述时钟源和所述震荡电路相互配合,产生时钟信号。
此外,所述时钟电路102除了具有产生时钟信号的功能之外,还可以具有对时钟信号进行分频、倍频等的功能,即将时钟源产生的时钟信号转换成多个不同频率的时钟信号,并分别发送给所述嵌入式系统中的需要不同频率的时钟信号的多个电路模块。
(3)计时器
本发明实施例中,可以首先为所述计时器103的计数数值设置一初始值pri,将所述计时器103设置成在所述初始值pri的基础上递增计数,或者,将所述计时器103设置成在所述初始值pri的基础上递减计数。
下面分别对所述计时器103递增计数和递减计数的过程进行说明。
当所述计时器103被设置成递增计数时,所述计时器103每接收到所述时钟电路102发送过来的一个时钟信号时,便将计数数值加一,直至所述计时器103的计数数值达到第一预设数值L1(例如计时器103对应的溢出值),当所述计时器103的计数数值达到第一预设数值L1时,生成一中断事件通知,通知所述处理器104执行中断服务程序。
此外,所述计时器103还需要计算所述计数数值从所述初始值递增计数到第一预设数值所需的时长δt,所述时长δt的计算公式如下:
δt=(L1-pri)*T
其中,δt为计数数值从所述初始值递增计数到第一预设数值所需的时长,pri为所述初始值,L1为所述第一预设阈值,T为时钟周期。
当所述计时器103被设置成递减计数时,所述计时器103每接收到所述时钟电路102发送过来的一个时钟信号时,便将计数数值减一,直至所述计时器103的计数数值达到第二预设数值L2(例如零值),当所述计时器103的计数数值达到第二预设数值L2时,生成一中断事件通知,通知所述处理器104执行中断服务程序。
此外,所述计时器103还需要计算所述计数数值从所述初始值递减计数到第二预设数值所需的时长δt,所述时长δt的计算公式如下:
δt=(pri-L2)*T
其中,δt为计数数值从所述初始值递减计数到第二预设数值所需的时长,pri为所述初始值,L2为所述第二预设阈值,T为时钟周期。
基于上述描述,本发明实施例的计时器103还可以包括:
第一计时模块,用于在每接收到一所述时钟信号时,将所述计数数值加一,并获取所述计数数值从所述计时器的初始值递增计数到第一预设数值所需的时长;或
第二计时模块,用于在每接收到一所述时钟信号时,将所述计数数值减一,并获取所述计数数值从所述初始值递减计数到第二预设数值所需的时长。
(4)处理器
处理器104在接收到计时器103发送的中断事件通知时,执行一中断服务程序,执行中断服务程序包括:统计所述中断服务程序的执行次数CNT,并根据所述执行次数CNT、所述计时器103计算得到的时长δt以及所述系统的校准时间,计算系统当前时间。
所谓中断,是嵌入式系统为计时器103提供的一种机制,当计时器103的计数数值达到预设数值(例如计数数值溢出时)时,则产生一中断事件通知,并第一时间发送给处理器104。
本实施例中,可以预先为计时器103的中断注册一个中断服务程序,当计时器103产生中断时,处理器104会临时停止当前执行的任务(本实施例中不考虑中断优先级、任务调度等问题),执行计时器103对应的中断服务程序,完成后再返回去执行先前的任务。
下面对中断服务程序执行时,计算系统当前时间的方法进行详细说明,主要包括以下步骤:
1)获取系统的校准时间。
在系统初始化后,可以首先进行系统时间的校准,从外部获取准确的时间(例如通过NTP协议获取时间或者提供人机交互界面由用户直接输入时间),将从外部获取的时间作为校准时间。此外,在进行系统时间校准时,还需要同时将中断服务程序的执行次数CNT清零。
举例来说,校准时间为2011年10月10日3点3份3秒。
2)获取计时器的计数数值达到预设数值所需的时长δt。
3)统计中断服务程序的执行次数CNT。
4)计算CNT与δt的乘积。
CNT*δt的值代表了计时器103的工作时长。
5)计算校准时间与CNT*δt之和,得到系统当前时间。
假如计算出的CNT*δt的值为864008秒(10天零8秒),系统当前时间即为2011年10月20日3点3分11秒。
本发明的其他实施例中,所述处理器104也可以通过其他计算方法计算系统当前时间。
举例来说,计时器103会设置一个系统初始时间,例如为1970年1月1体0点0分0秒,处理器104可以采用获取到的校准时间减去系统初始时间,得到一个时间差值M,并将CNT的值修改为CNT+(M/δt),然后计算系统初始时间与CNT*δt之和,得到系统当前时间。
本发明实施例中,所述处理器104还可以在每次执行中断服务程序时,将计时器103的计数数值重置成初始值pri。在处理器104执行其他任务,包括校准系统时间等,计时器103仍会按照自身的既定节拍运行,并在计时器到达计时阀值时产生计时器中断。
但是,每次执行中断服务程序的时候,简单将计数器103的值重置为初始值pri会产生一个时间误差,下面对这个时间误差的产生原因和消除该误差的方法做说明。
上述实施例中,处理器104在接收到中断事件通知后,需要先处理完当前正在处理的任务片段,并保护现场,然后再执行中断服务程序,本发明实施例中,将处理器104在接收到中断事件通知到开始执行中断服务程序之间的这段时间称为中断潜伏期。
由于中断潜伏期的存在,处理器104在重置计时器的初始值时,如果简单将计时器103的初始值重置为pri,会出现计时误差,具体理由如下:
假设从计时器产生中断到计时器中断服务程序被执行的时间长度为t1,处理器从开始执行计时器中断服务程序到重置计时器的计数数值的时间长度为t2,计时器被重置为pri到计时器溢出的时间为δt。
那么,可以看出如果计时器被简单重置为初始值pri,则计时器每溢出一次(计时器中断服务程序被执行一次)所用的时间应该为δt+t1+t2。其中,t1和t2就是累计时间时产生的误差,这两个值一般很小且值不固定,但长期累积就会产生巨大的误差,需要将其消除掉,将计时器中断服务程序被执行的平均间隔时间精确控制在δt值上。
下面对如何消除上述由软件引入的计时误差的方法进行详细说明。
本发明实施例中,可以通过调整重置的计时器103的计数数值,将“中断潜伏期”+“中断服务程序执行到重置计数数值所需时间”这个时间误差减掉。
具体消除过程如下:
当计时器103以递增方式计数时,在计时器103溢出后,可以将计时器103设置为将计数数值自动清零,并继续从0开始递增计数。假设中断服务程序重置计时器的初始值时,计时器的计数数值为y,则y*T=“中断潜伏期”+“中断服务程序执行到重置计数数值所需时间”。此时,可以将pri+y作为新的初始值,重置计时器的计数数值。
如果直接将计数数值重置为pri+y,则可能也会引入误差,因为处理器在执行重置操作时(该重置操作包括读取y值,并与pri相加,然后将得到相加和写回计时器),需要执行时间,而在此期间,计时器仍在不断递增,从而引入、增加了“y与pri相加、相加和写入计时器等”指令执行所需要时间。
为了解决重置操作引起的计时误差,本发明实施例中,如图2所示,可以将计数数值分为两段高位计数段(Hreg)和低位计数段(Lreg),其中,低位计数段从bit[0]~bit[x+1],高位计数段从bit[x+2]~bit[n],高位计数段和低位计数段共具有n+1个二进制比特。
另外,需要说明的是,本发明实施例中,设置初始值pri时,需要确保pri的值转换为二进制时对应的bit[0]~bit[x+1]的值都为0,确保δt值小于1秒,以便获得一个合适的最小时间粒度。最好使的1秒恰好是δt的整数倍,如δt取值50毫秒、100毫秒、500毫秒等值,以便在执行中断服务程序时方便地根据δt和CNT值(中断服务程序被执行的次数)计算年月日时分秒的值;δt不要太小,否则中断服务程序会被过度频繁执行,消耗大量的CPU计算运算资源。
假设所述计时器103被设置成递增计数,所述计时器103每接收到所述时钟电路102发送过来的一个时钟信号,便将计数数值加一,直至所述计时器103的计数数值溢出(计数数值达到2n+1,2n+1即上述预设数值),当所述计时器103的计数数值溢出时,生成一中断事件通知,通知所述处理器104执行中断服务程序。
此外,所述计时器103还需要计算所述计数数值从所述初始值递增计数到溢出值所需的时长δt,δt的计算公式如下:
δt=(2n+1-pri)*T
其中,pri为计数数值的初始值,2n+1为计数数值的溢出值,T为时钟周期,*号为乘号。
假设计数数值为pri时,Hreg的值为P,Lreg的值为Q(由上文提到的pri取值原则可知,Q=0);计数数值为y时,Hreg的值为p,Lreg的值为q。
由此可得出:
pri+y=P*(2x+2)+Q+p*(2x+2)+q=(P+p)*(2x+2)+q
本发明实施例中,重置计数数值时,只需对Hreg进行重置,而Lreg继续进行递增计数,Lreg继续计数的目的就是要要消除t1+t2这个误差。
上面提到了,计时器溢出时,计数数值会清零,并从0开始递增计数。当处理器经过了中断潜伏期(时间长度为t1),开始执行计时器中断服务程序,从开始执行中断服务程序到执行重置计时器(Hreg,Lreg)用时为t2,在这个过程中,Lreg还在继续计数,且其起始值为0。当在中断服务程序中执行重置计时器指令的那一刻,只需要查看Lreg此时的计数值就能够知道想知道t1+t2的值了,假定这一刻的Lreg值为q,那么t1+t2=q*T。其中,T为计时器输入时钟信号的周期。
重置计数数值的初始值时,不是简单重置为pri,而是重置为pri+q,那么下次计时器溢出的时间间隔就不是δt时长了,而是δt-(t1+t2),这样就会把上次中断产生时引入的t1+t2这个时间误差给抵消掉。
本发明实施例中,将处理器执行计数数值重置指令所需要的时间也考虑进来,在重置计数数值时,只对Hreg部分进行操作,Lreg不操作(继续做计数),处理器执行计数数值重置指令所需要的时间也会被抵消掉,以便保证计时程序完全不会引入计时时间误差。
另外,在对计数数值进行Hreg、Lreg分段的时候,Lreg段共有x+2个bit位,其最大值为qmax,其中,qmax*T>“中断潜伏期”+“中断服务程序执行到重置计数数值所需时间”,也就是在中断事件发生到重置计数数值的过程中,Lreg位段不能向Hreg位段进位。
上述实施例中,是以计时器递增计数为例进行说明。
当计时器103被设置成递减计数,所述计时器103每接收到所述时钟电路102发送过来的一个时钟信号,便将计数数值减一,直至所述计时器103的计数数值归零(此时,零值即上述预设数值),当所述计时器103的计数数值归零时,生成一中断事件通知,通知所述处理器104执行中断服务程序。
此外,所述计时器103还需要计算所述计数数值从所述初始值递减计数到零值所需的时长δt,δt的计算公式如下:
δt=pri*T
其中,pri为计数数值的初始值,T为时钟周期,*号为乘号。另外,为了消除计时误差,所述计时器103的计数数值归零后,可以将计时器103的计数数值设置为2n+1-1,并继续递减计数,以获取计时误差。
基于上述描述,本发明实施例的处理器还包括:
误差计算模块,用于获取从接收到所述中断事件通知至重置所述计时器的初始值之间所述计时器的计数数值;
所述计时器重置模块,还用于在执行所述中断服务程序时,将所述计时器的初始值重置为预设初始值加所述中间潜伏期及部分程序指令执行时间对应的计数数值。
通过上述实施例提供的嵌入式系统,在实现精确计时的同时,不需要增加硬件设计的成本,不需辅助的电路设计。只需借助计时器通过软件的方式完成,不会引入任何的时间误差。嵌入式系统的时间精度仅与时钟源的精度相关,经过实验和理论计算得知,采用50ppm精度的时钟源,本发明实施例的嵌入式系统每天可能出现的最大时间误差是4.32秒,采用10ppm精度的时钟源,本发明实施例的嵌入式系统每天可能出现的最大时间误差是0.864秒。
对应于上述嵌入式系统,本发明实施例还提供一种嵌入式系统的计时方法,如图3所示,所述嵌入式系统的计时方法包括以下步骤:
步骤301,接收时钟电路产生的时钟信号,并采用计时器根据接收到的所述时钟信号的数量进行计数,得到一计数数值,在所述计数数值达到预设数值时,生成一中断事件通知;
步骤302,获取所述计数数值达到预设数值所需的时长;
步骤303,获取系统的校准时间;
步骤304,在接收到所述中断事件通知后,执行中断服务程序,所述执行中断服务程序包括:统计所述中断服务程序的执行次数,并根据所述时长、所述执行次数以及所述校准时间,计算系统当前时间。
本发明实施例中,可以首先为计数数值设置一初始值,将所述计时器设置成在所述初始值的基础上递增计数,或者,将所述计时器设置成在所述初始值的基础上递减计数。
即,上述根据接收到的所述时钟信号的数量进行计数,得到一计数数值的步骤包括:
在每接收到一所述时钟信号时,将所述计数数值加一,并获取所述计数数值从所述初始值递增计数到第一预设数值所需的时长;或
在每接收到一所述时钟信号时,将所述计数数值减一,并获取所述计数数值从所述初始值递减计数到第二预设数值所需的时长;
所述计数数值从所述初始值递增计数到第一预设数值所需的时长的计算公式如下:
δt=(L1-pri)*T
其中,δt为计数数值从所述初始值递增计数到第一预设数值所需的时长,pri为所述初始值,L1为所述第一预设阈值,T为时钟周期;
所述计数数值从所述初始值递减计数到第二预设数值所需的时长的计算公式如下:
δt=(pri-L2)*T
其中,δt为计数数值从所述初始值递减计数到第二预设数值所需的时长,pri为所述初始值,L2为所述第二预设阈值,T为时钟周期。
为了消除软件引入的计时误差,本发明实施例中,所述执行中断服务程序的步骤还包括:重置所述计时器的初始值。
所述重置所述计时器的初始值的步骤包括:
获取从接收到所述中断事件通知至重置所述计时器的初始值之间的所述计时器的计数数值,作为误差值,并计算所述误差值与所述初始值的和值;
将所述和值作为所述计时器的初始值,并重置所述计时器的初始值。
为了消除软件计时误差,所述计数数值被分为高位计数段和低位计数段,所述将所述和值作为所述计时器的初始值,并重置所述计时器的初始值的步骤包括:将所述和值作为所述计时器的初始值,仅重置所述计时器的初始值的高位计数段的值。
通过上述实施例提供的计时方法,在实现精确计时的同时,不需要增加硬件设计的成本,不需辅助的电路设计。只需借助计时器通过软件的方式完成,不会引入任何的软件执行所带来的时间误差。嵌入式系统的时间精度仅与时钟源的精度相关。
如图4所示为本发明实施例的嵌入式系统的另一结构示意图,所述嵌入式系统包括:微处理器、时钟源、RAM和ROM,其中微处理器又包括:CPU核心单元(相当于上述实施例中的处理器104)、计时器(相当于上述实施例中的计时器103)和时钟电路。其中,时钟源和所述时钟电路配合相当于上述实施例中的时钟电路102。
如图5所示,本实施例的嵌入式系统的运行过程如下:
步骤501,系统上电启动;
步骤502,系统初始化;
步骤503,计时器初始化,注册中断服务程序;
其中,计时器初始化包括:设置计时器的初始值;设置计时器递增或递减计数;输入时钟周期T等。
步骤504,校准系统时间;
步骤505,运行其他各项任务。
如图6所示,本实施例的时嵌入式系统执行中断服务程序的过程包括以下步骤:
步骤601,进入中断服务程序;
步骤602,重置计时器的计数数值的值;
步骤603,统计中断服务程序的执行次数CNT;
步骤604,根据δt和CNT,计算系统当前时间;
步骤605,退出中断服务程序。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以作出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。