时间同步方法及装置
技术领域
本发明涉及通信设备中系统时间同步技术,尤其是一种通信设备中时间同步方法,以及时间同步装置。
背景技术
对于通信网中的各种通信设备或者计算机设备来说,设备内部的系统时间作为重要参数需要与协调世界时(Universal Time Coordinated,简称UTC)保持尽可能的同步,通常时间偏差被限定在足够小的范围内(如100ms)。为了保证时间同步能够顺利完成,时间同步网络中的各个节点时钟都需要利用专用的网络时间同步技术与UTC同步。在互联网络中,普遍采用网络时间协议(Network Time Protocol,简称NTP)作为互联网络中各种通信设备的系统时间的时间同步协议,时间同步的准确程度和NTP服务器与用户间的距离有关。
对于通信设备内部的各个部件来说,也需要保证时间的同步性,在采用多核CPU的通信设备中,多核CPU中的各个CPU可以运行独立的任务,在报文处理上可采用流水线方式或者并行处理方式。如图1所示,为多核CPU中采用流水线方式的报文处理示意图,在流水线方式下,每个CPU完成报文处理的一部分。如图2所示,为多核CPU中采用并行处理方式的报文处理示意图,在并行处理方式下,每个CPU可以独立完成报文的全部处理。无论采用流水线的方式还是并行处理的方式,多核CPU之间时间同步在某些情况下是正确处理业务的前提。
现有技术中关于多CPU之间时间的同步采用以下方式:利用一个外部的定时器对各个CPU核按照周期同时发出定时器中断,所谓外部的定时器为一种可按照一定的周期发出定时器中断的设备,而各个CPU核在上电时会获取相同的系统时间初值,再根据接收到的定时器中断进行累加,以获得当前的系统时间,从而保证了各个CPU之间时间的同步。这种同步方式可保证各个CPU核之间的时间同步,但是这种定时器中断需要各个CPU核都进行响应,从而使得各个CPU的开销变大,导致系统的整个处理性能受到较大影响。
发明内容
本发明的目的是针对现有的多核CPU中时间同步时定时器中断对系统性能的影响等缺陷,提出一种时间同步方法,能够保证多核CPU内的系统时间一致,且不需要每个CPU核都处理定时器中断,以降低定时器中断对系统的处理性能的影响。
本发明的另一目的是提出一种时间同步装置,能够保证多核CPU内的系统时间一致,且不需要每个CPU核都处理定时器中断,以降低定时器中断对系统的处理性能的影响。
为买现上述目的,本发明提供了一种时间同步方法,包括以下步骤:
步骤1,主控CPU核根据内部定时器发出的定时器中断对系统时间存储模块中存储的系统时间进行累加,以获得当前的系统时间;
步骤2,主控CPU核将所述当前的系统时间写入系统时间存储模块;
步骤3,所述非主控CPU核收到获取系统时间的请求时,从所述系统时间存储模块读取所述当前的系统时间。
在上述技术方案中,所述步骤1之前,主控CPU核在上电初始化时从时钟源读取时钟源内保存的系统时间初值。当采用硬件实时时钟作为时钟源时,由于硬件实时时钟内的编码方式与操作系统有所区别,例如硬件实时时钟采用BCD编码,而操作系统采用BIN(二进制)编码,因此需要进行格式转换。
进一步地,步骤3之后,主控CPU核在掉电前将所述当前的系统时间写入时钟源,并由所述时钟源对所述当前的系统时间进行维护。
可选地,步骤2具体为:将所述当前的系统时间封装为存储在系统时间存储模块的软件设备,所述主控CPU核对该软件设备执行写入操作。采用对软件设备读写的方式可以解决多核间不能互访各自的内存区域的问题。
进一步地,步骤3具体为:所述非主控CPU核收到获取系统时间的请求时,对该软件设备执行读取操作。
为实现上述目的,本发明提供了一种时间同步装置,该时间同步装置用于多核CPU系统,其包括主控CPU核、一个或数个非主控CPU核和用于存储系统时间的系统时间存储模块,该主控CPU核中包括:
内部定时器,用于按照周期发出定时器中断;
累加模块,与所述内部定时器和系统时间存储模块相连,用于接收所述内部定时器发出的定时器中断对系统时间存储模块存储的系统时间进行累加,获得当前的系统时间,并写入系统时间存储模块;
该一个或数个非主控CPU核包括:
接收请求模块,用于接收获取系统时间的请求;
内存读取模块,与所述系统时间存储模块和接收请求模块相连,用于根据接收请求模块发送的获取系统时间的请求从所述系统时间存储模块读取所述当前的系统时间。
在上述技术方案中,还可以包括时钟源,与所述累加模块相连,用于为所述主控CPU核提供系统时间初值。所述时钟源可为硬件实时时钟。
基于上述的技术方案,本发明具有以下优点:通过主控CPU核集中管理系统时间计算的硬件资源,并将系统时间写入系统时间存储模块,由其他非主控CPU核在需要时直接读取,这样既可以使非主控CPU核能够共享当前的系统时间,又不需要利用定时器中断来同步系统时间,从而在保证了系统时间的同步的同时,只需要主控CPU响应定时器中断,以此提高了系统性能。在实现上将当前的系统时间作为系统时间变量写入系统时间存储模块,并封装为一个软件设备,在软件设计和应用上可以利用统一的接口进行操作。
下面通过附图和实施例,对本发明的技术方案做进一步的详细描述。
附图说明
图1为多核CPU中采用流水线方式的报文处理示意图。
图2为多核CPU中采用并行处理方式的报文处理示意图。
图3为本发明时间同步装置的一实施例的结构示意图。
图4为本发明时间同步装置的另一实施例的结构示意图。
图5为本发明时间同步方法的一实施例的流程示意图。
图6为本发明时间同步方法的另一实施例的流程示意图。
图7为本发明时间同步方法的又一实施例的流程示意图。
图8为采用软件时钟方式的系统时间同步系统的结构示意图。
具体实施方式
鉴于现有多CPU核通信设备中,各个CPU核在维护和同步系统时间时都需要使用内部定时器中断,从而影响系统性能,本发明采用一种集中式的时钟管理,不需要每个CPU核都去维护系统时间,从而既使CPU核能够共享当前的系统时间,又提高了系统性能。
如图3所示,为本发明时间同步装置的一实施例的结构示意图,在本实施例中,系统时间同步系统包括主控CPU核1、系统时间存储模块2和其他的CPU核3。其中主控CPU核1能够对系统时间作集中式管理,而其他的CPU核3为非主控CPU核,不需对系统时间进行维护,只有在需要使用时才进行获取。在这个实施例中,适用于多CPU核通信设备为不常掉电的单板的情况,在初始上电时通过外部时钟源为主控CPU核提供系统时间初值或者利用预设的设备参数,再由主控CPU核1实现系统时间的维护。所谓外部时钟源可以为软件时钟源或者外部时钟源(例如硬件RTC),预设的设备参数可以为厂家写入到多核CPU的初始设备信息。如果单板需要经常的掉电和上电,那就需要采用外部的时钟源了。
在主控CPU核1中包括内部定时器11和累加模块12,其中累加模块12可以接收内部定时器11按照周期发出的定时器中断,并将系统时间存储模块2中的系统时间进行累加,获得当前的系统时间,然后写回系统时间存储模块2。系统时间存储模块2中所存储的系统时间是在预设或接收外部时钟源的系统时间初值的基础上,根据内部定时器12发出的定时器中断不断累加获得的。
非主控CPU核3包括接收请求模块31和内存读取模块32,当非主控CPU核3上运行的上层程序向非主控CPU核3中的接收请求模块31发出获取系统时间的请求时,内存读取模块32可以根据接收请求模块31发送的获取系统时间的请求从系统时间存储模块2读取当前的系统时间。
如图4所示,为本发明时间同步装置的另一实施例的结构示意图,与上一实施例相比,增加了时钟源4,时钟源4与主控CPU核1中的累加模块12相连,其可以为外部的软件时钟源或硬件时钟源(硬件RTC)。
累加模块12可以在上电时从时钟源2中获取系统时间作为系统时间初值,并根据内部定时器12发出的定时器中断对系统时间初值进行累加,获得当前的系统时间,然后将当前的系统时间写入系统时间存储模块2。累加模块12也可在设备掉电前,可以将当前的系统时间写入时钟源2,并由时钟源2对当前的系统时间进行维持。
非主控CPU核在操作系统运行时不需要处理对时钟源的信号,只需要在收到上层软件获取系统时间的请求时,才从预定的内存区域读取当前的系统时间以供上层软件使用。
如图5所示,为本发明时间同步方法的一实施例的流程示意图,包括以下步骤:
步骤101,主控CPU核根据内部定时器发出的定时器中断对系统时间存储模块中存储的系统时间进行累加,以获得当前的系统时间;
步骤102,主控CPU核将当前的系统时间写入系统时间存储模块;
步骤103,非主控CPU核收到获取系统时间的请求时,从系统时间存储模块读取当前的系统时间。
本实施例中主控CPU核内部的定时器作为硬件资源,与单核CPU内的定时器相比不必有特殊要求,无论定时器的设计方式如何,定时器只需要按照Tick间隔给主控CPU一个定时器中断即可。主控CPU核可以利用这个定时器中断从系统时间初值开始进行时间累加,以获得当前系统时间。
如图6所示,为本发明时间同步方法的另一实施例的流程示意图,本实施例对上一实施例的系统时间初值进行进一步地描述,在步骤101之前还可以包括步骤100,即主控CPU核在上电初始化时从时钟源读取该时钟源内保存的系统时间初值。当采用硬件实时时钟作为时钟源时,由于硬件实时时钟内的编码方式与操作系统有所区别,例如硬件实时时钟采用BCD编码,而操作系统采用BIN(二进制)编码,因此需要进行格式转换,由于格式变换已经是所属领域技术人员很容易实现的技术,这里就不赘述了。
在步骤3之后,主控CPU核还可以在掉电前将当前的系统时间写入所述时钟源,并由时钟源对所述当前的系统时间进行维护,以供下次上电时由主控CPU核读取。
系统时间在操作系统运行过程中实际上是一种存储在某段内存地址的变量,该段内存地址即图3中的系统时间存储模块2,在利用高级语言或汇编语言编程实现的时候,可以将系统时间变量作为一个软件设备进行封装,而这个软件设备实际占用着内存中的预定区域,例如MEM地址,在某些基于多核的通讯设备中,各CPU核所操作的内存区域是相互区分的,通过封装成软件设备的方式,就可以对该软件设备进行读写,从而操作其他不属于该CPU核的内存区域。
下面用C语言给出了该软件设备的定义:
struct sys_time
{
spinlock_t lock;//spinlock_t表示软件中的自旋锁,用于互斥操作;
int time_ms;
int time_sec;
int time_min;
int time_hour;
int time_day;
int time_month;
int time_year;
int time_weekday;
int yearday;
int time_isdst;//time_isdst表示“是否为日光节约时间”,与标准Linux中的定义相匹配;
}
主控CPU核对这个软件设备具有读写权限,负责向软件设备定时更新当前的系统时间;而其他的非主控CPU核只具有读权限,只有在需要的时候才从该软件设备上读取系统时间。
如图7所示,为本发明时间同步方法的又一实施例的流程示意图,包括以下步骤:
步骤101,主控CPU核根据内部定时器发出的定时器中断对系统时间存储模块中存储的系统时间进行累加,以获得当前的系统时间;
步骤102’,将当前的系统时间封装为存储在系统时间存储模块的软件设备,主控CPU核对该软件设备执行写入操作;
步骤103’,非主控CPU核收到获取系统时间的请求时,对该软件设备执行读取操作。
本实施例也可以在步骤101之前加入上一实施例中的步骤100,在步骤103’之后加入上一实施例中的步骤104。
其中采用C语言描述的系统时间定义不应作为实现方式的限制,其它的可以完成系统时间变量的定义的实现形式也应在本发明的覆盖范围之内。
除了以主控CPU核进行集中式管理以外,还可以采用软件时钟方式进行系统时间管理,如图8所示,为采用软件时钟方式的系统时间同步系统的结构示意图,每个CPU核与单核CPU核相比,没有特殊的要求,但时钟源可采用一种软件时钟源6,整个系统由软件时钟源6集中管理,避免了各个CPU核的晶振、定时器等差异带来的系统时间误差,软件时钟源6从硬件时钟源(硬件RTC)中获取系统时间初值,并根据外部的硬件定时器对系统时间初值进行累加以获得当前系统时间。然后根据上层软件要求的时间精度,在软件时钟在软件定时事件触发时,通过软件时钟信号5(例如消息、软件脉冲信号等)周期的向各个CPU核发送软件时钟信号,再由各个CPU核自行更新维护系统时间。由于CPU核对软件时钟信号的处理要比处理定时器中对系统性能的影响要小得多,因此可以在很小的系统性能的影响下实现系统时间的同步。
最后应当说明的是:以上实施例仅用以说明本发明的技术方案而非对其限制;尽管参照较佳实施例对本发明进行了详细的说明,所属领域的普通技术人员应当理解:依然可以对本发明的具体实施方式进行修改或者对部分技术特征进行等同替换;而不脱离本发明技术方案的精神,其均应涵盖在本发明请求保护的技术方案范围当中。