(二)1588时钟的误差的来源,如何最直观的理解1588的各种机制?如何科学的解决这些时钟误差?

哇,最近太卷了,封闭开发,因此,不好意思,博客只是开一个头就被迫中断了,这一中断就是半年的时间,实在是对不起因上一篇文章关注我的几个粉丝了。也是谢谢你们给我动力,还挺开心的。

现在,我们继续讲讲,希望还能接得上。

在上一个章节的说明中,引用到这个图了,也以通俗的话语解释了同步的原理,如下

在理想情况下,同步是很简单的,这几个就足够了!但是现实不一样。同步的误差一共有3处的问题!

简单的说,误差来源有

1. 主机的误差;

2. 链路的误差;

3. 从机的误差;

为此,1588就需要在上图的基础上增加很多的东西保证可靠性与准度,尤其是测量仪器与工业控制所需要的准确度。

1.所谓主机的误差

说的是时钟是由主机产生的。时钟信号包含频率、周期、抖动、漂移等参考指标。若是自己的时钟系统走的不准,那一切的基础都不存在。也就是master不准,当然,这个在工程实践中,是必须默认master是准的,或者说,master不准不在工程的考虑范围之内,但是你要清楚,这个是很重要的一个误差源。

解决方法:这个没有什么解决方案,在工程中,要求master是一定准的,若不准,则需要换,你只是需要定位出是master不准就可以了,或者说,咱们可以做的是增加一个PI的控制器,这类的参考文件很多,这个时钟的闭环控制不在本专栏的讨论中。首选需要说明的是,主要的方法还是要靠芯片自身,要是芯片根本不准的话,就真的算了。

2.所谓链路的误差

是在在计算Delay与Offset的时候,使用的平均值,这个的基础是网络是对称的,没有时延的,但是,有可能网络的负载很重,里面有交换机有路由器等等,交换机等等都有自己的瓶颈,这样的设备会让传输的时间变得不稳定,而且,网络中不一定是直连,可能是回环的网络,两个设备可能有很多的通路可以走,这就导致计算delay与offset变得不稳定。

解决方法:让链路变得干净一些,一定注意不要有回环。

同时,为了接着这个问题,会引出E2E与P2P两种1588工作模式。

3. 最后讲讲从机的误差,也就是你编码的设备的误差

继续用上面的那个图,当sync报文,从master发出的时候,记录的时间为t1,但是,这个时间只是一个理论上的时间,t2,t3等等同理。具体的说,是你的操作系统或者是你的代码记录了时间(无论是发送还是接受),这个1588报文数据出去的时候,这个是物理层,这个中间有一个时间差。

具体的讲,关于时间的准度的问题,在第一讲说过,1588是时钟的一个网络协议,时间信息是被封装在网络的报文中的,那么,也就存在着一个赋值的问题。在一般的通讯中,都是应用层给数据结构(最常用的就是数组了)赋值,然后指针传到协议栈,然后再通过操作系统的调度最终到MAC层,然后再通过PHY将真正的数据发出去,在接收端也是如此,只有说,操作系统之上的应用层收到报文之后,才可以通过判断知道这个是1588的报文,这个报文中存在时间信息。

但是问题在于,协议栈的赋值,操作系统的调度的,是完全达不到1588的要求的(1588最高可到ns)。因为这个时间是不可控的,尤其是操作系统或者是协议栈负载很重的情况下,无法达到硬实时的要求的。下面是OSI的七层网络,可以看到UDP,也就是1588协议的载体是在第四层,于是1588就在设想,是否可以在更底层打时间戳,在所谓的硬件层打时间戳,就会更准了!

这样就衍生出了gPTP,是通过PHY层或者是MAC层进行控制时间的,这就是为什么L2层1588要比L4层1588精准度更高的原因(后面再讲)

备注:PHY的芯片厂商也支持1588,所以,也可以说是在PHY做的。

可以通过更底层的打时间戳来解决这个误差。

我想让我的读者知其然知其所以然。

猜你喜欢

转载自blog.csdn.net/2301_77258991/article/details/132267684