三种情况
这里可以大致的分为以下的几种情况
- linux-桌面级
- 嵌入式linux
- 其他的,比如单片机等等
在第一和第二中,都是使用linux,这个就简单多了,可以直接下载ptpd或者是ptp4l的代码,直接安装或者是交叉编译,这个是几乎没有工作量的。
问题主要集中在3,也就是单片机的嵌入式的迁移。最开始的时候,我曾经设想,把ptpd或者是ptp4l迁移到单片机中,但是后面放弃了,是因为太麻烦了,从驱动层到应用层的依赖过多,本不想搭在这个上面多少时间的。
所以,我这边选择了一个ST公司改的一个PTP的工程。然后再加入自己的应用逻辑。
实现路径与编码(这里只是说ipv4-udp)
1.在你的嵌入式系统中,一定要有一个精度很高的守时的模组,一般可以在10ns左右的,这个是1588的基础,要不,你自己不会计时,那什么都没招。要配置两个接口,分别是setTime和getTime。
2. 你需要清楚,1588这个是一个协议,所以,你需要启动两个socket,用于事件接口和通用接口,打开多播,配置多播IP,端口号是319和320。做好回调函数,接入1588时间同步的状态机中。这个是别人写好的,你不需要有任何的操作。
(三)1588的事件接口(event interface)和通用接口(general interface),1588的报文格式?-CSDN博客
3. 在接受数据之后,在应用层打上时间戳,这个对应的是T2,可以参考这个链接中的图。诸如此类的,T3的时间戳是在发送的时候打上的。这两个量是全局变量。
至此,很简单,你就拿到了所有的关键的时间信息,然后配合好内部的函数,就完成了时间的同步(先不管精度,你现在最起码可以同步时间了,就是这么简单)
现在写一下关于一般情况的调优(针对IPV4-UDP):
1. 一般而言,是强制设备为从机(话说回来了,要是做主机的话,就不会用ipv4-udp了)
2. 设定这两个线程的优先级最高,因为要尽可能的减少操作系统中其他任务的干扰。
(二)1588时钟的误差的来源,如何最直观的理解1588的各种机制?如何科学的解决这些时钟误差?-CSDN博客
3.在场景中,尽可能的避免复杂的网络,更不要有回环的网络
4. PID的调试。
最后(关于PHY-1588)
能不用IPV4-UDP就不用,最好是用PHY层的。《1588时钟的误差的来源,如何最直观的理解1588的各种机制?如何科学的解决这些时钟误差?》讲的很清楚,你要是用操作系统和协议栈,不论你的主频有多高,操作系统的节拍一般而言也就是1K-10K左右,稍微波动一下,0.1ms级别的时间就抖动没了,这个精度就没法保证了。
我为什么总是说IPV4-UDP呢,是因为我给一个老系统升级,这个PHY不支持1588。
简单的说一下PHY的工作原理,实际上也很简单,就是PHY认识这个1588的报文,当这个报文到达PHY的时候,PHY自己就会记录一个时间,这个时候你的操作系统和协议中是不知道的,后面他们收到数据之后,你通过你的应用层的代码去解析,哦,我收到了一个1588的报文,然后去读PHY的寄存器,这个寄存器就会给你收到这个数据的时间。
这里就替换了T2与T3的应用层的时间戳,这样的精度就可以有大幅度的提高。
若是没有做到PHY层的话,实际上PID是没有意义的。
至此,初级篇已经结束。