1. 功能概述¶
本文主要以J6X Matrix板子为例,介绍四个适用于不同场景的时间同步方案,包括单时间域方案和双时间域方案。目前MCU主线默认支持的是时间源接入J6 MCU的单时间域方案。
注意:由于gPTP需要在AUTOSAR BSW中实现,因此对于不包括AUTOSAR BSW的地平线交付软件,本文列举的gPTP功能需要客户自行实现,地平线不负责交付。 此外,实际芯片存在多个网卡,本文sample重点以网卡0中的phc0为例进行说明,其他网卡以此类推。
1.1. 软件架构说明¶
1.1.1. 时间源接入MCU的单时间域方案¶

上图时间同步流程总结如下:
外部gptp master设备作为整个J6X的时间源;
首先通过MCU侧gptp时间同步将gptp master的时间同步给MCU侧的Stbm(PHC),该过程持续进行;
gptp master的时间同步给Stbm(PHC)之后,MCU timesync软件将该时间同步给RTC;
接下来Acore timesync_sample软件将RTC时间同步到Acore网卡和Linux系统时间。
特性说明:
RTC硬件实体位于MCU侧,Acore可以通过影子寄存器读取到MCU RTC时间,但是没有写权限;
RTC支持给图中的CIM和CAN打硬件时间戳;
Acore 网卡可以发出PPS,触发LPWM进行曝光同步。
1.1.2. 时间源接入Acore的单时间域方案¶

上图时间同步流程总结如下:
外部gptp master设备作为整个J6X的时间源;
首先通过ptp4l软件将gptp master的时间同步给Acore侧的网卡;然后通过phc2sys将网卡时间同步给Linux系统时间,该过程持续进行;
接下来通过Acore timesync_sample软件将网卡时间同步给MCU侧RTC和Stbm(PHC)。
特性说明:
RTC支持给图中的CIM和CAN打硬件时间戳;
Acore 网卡可以发出PPS,触发LPWM进行曝光同步。
1.1.3. 时间源接入MCU的双时间域方案¶

上图时间同步流程总结如下:
gptp master作为整个J6X的时间源;
gptp master的时间首先通过gptp同步到MCU的Stbm(PHC),该过程持续进行;
gptp master的时间同步给Stbm(PHC)之后,MCU侧timesync软件将Stbm(PHC)的时间同步给RTC,该过程只同步一次;
之后,Acore timesync_sample软件一边将Stbm(PHC)的时间同步给Acore Linux系统时间,一边将RTC时间同步给Acore网卡时间。
特性说明:
RTC硬件实体位于MCU侧,Acore可以通过影子寄存器读取到MCU RTC时间,但是没有写权限;
RTC支持给图中的CIM和CAN打硬件时间戳;
Acore 网卡可以发出PPS,触发LPWM进行曝光同步。
1.1.4. 时间源接入Acore,MCU使用xgmac时间的同步方案¶

上图时间同步流程总结如下:
gptp master作为整个J6X的时间源;
gptp master的时间首先通过gptp同步到Acore xgmac;
gptp master的时间同步给Acore xgmac之后,MCU侧timesync软件将xgmac的时间同步给Stbm(Gpt)。
特性说明:
xgmac硬件实体位于Acore侧,MCU可以通过影子寄存器读取到xgmac时间。
1.2. 代码位置及目录结构¶
2. Acore编译¶
2.1. 编译环境¶
2.2. 编译说明¶
3. MCU编译¶
3.1. 编译环境¶
3.2. 编译说明¶
对于编译product(product镜像是指完整的AUTOSAR产品镜像,需要您根据自己的工程场景自行补充BSW/RTE/SWC等相关源码)
3.3. 注意事项¶
地平线提供的MCU镜像中默认没有打开ptp至RTC连续同步的功能,而是默认ptp至RTC只同步一次时间,这是通过宏 PRODUCT_IMAGE 的定义实现的。这部分的配置在 Service/TimeSync/src/Hobot_TimeSync.c 文件中,内容如下:
如果需要打开 ptp 至 RTC 连续同步的功能,在 Hobot_TimeSync.c 文件开头处 undef 宏 PRODUCT_IMAGE。用户可以根据自己需要只保留一组自己需要的配置,时间同步其他场景的配置也是同理。
4. 运行¶
4.1. 支持平台¶
MatrixV1P1 J6P/H
4.2. 板端部署及配置¶
需要做好如下准备工作:
烧写好支持MCU侧时间同步服务的MCU固件。
若需要运行gptp时间同步,需要保证网络连通。
为了防止Linux操作系统自带时间同步服务产生干扰,需要执行如下命令关闭Linux自带时间同步服务。
4.3. 运行指南¶
注意,如下Log仅供参考,用户实际运行的Log和本文Log可能会有一些小差异,以实际运行为主。
4.3.1. 时间源接入MCU的单时间域方案¶
MCU侧通过宏PRODUCT_IMAGE默认关闭了ptp至RTC连续同步的功能,详细修改方式请参考上述注意事项章节。
刷写启动后,在Linux控制台执行如下命令,第一条命令设置log等级,允许输出打印到控制台。第三条命令启动时间同步程序,将MCU RTC时间同步到Acore系统时间和网卡时间。
关键参数说明:
-s 1:同步系统时间(默认); -s 0:不同步系统时间
-e 1:使用调频机制(默认); -e 0:使用调幅机制
-p 1:同步网卡1的时间; -p 0:同步网卡0的时间(默认)
-w:设置Linux系统时间误差的报警阈值(默认值1000000,单位:ns)
-n:设置网卡时间误差的报警阈值(默认值100000,单位:ns)
注意:开启调频伺服控制后,PI算法会被启用进行频率调节,实现高精度时间同步并防止时间回退或者跳变。如果时间源跳变幅度较大,用户可能需要修改sample代码中的比例增益Kp和积分增益Ki防止调节过冲或者过缓。
Acore 时间同步log如下:
Acore log说明:
“snapshot”字段为MCU网卡发出PPS秒脉冲时各个clock对应的硬件时间戳;“PPS fetch infobuf time”字段为Acore PPS驱动捕获到的系统时间; “offset”字段为Acore系统时间、网卡时间与MCU侧RTC的时间差。
注意:
上述命令通过PPS机制抓取网卡时间、RTC时间、Linux系统时间在同一时刻的时间戳,计算出offset后对网卡时间和Linux系统时间进行校准,从而将RTC时间持续同步到另外两个clock。注意,当操作系统处于极端负载时, 由于网卡通过硬件自动抓取时间戳,因此其精度不受到系统中断响应延迟影响。但是Linux系统时间为抽象出来的软件时间,由PPS驱动在中断服务程序里面抓取时间快照,因此在大压力下受到中断响应延迟影响存在误差。
优化方法:通过执行“./timesync_sample -p 0 -e 0 -s 0 -w 1000000 -n 100000”命令将RTC时间先同步到网卡时间,然后通过执行“phc2sys -c CLOCK_REALTIME -s eth0 -O 0 -m”命令再将网卡时间同步到系统时间。
MCU时间同步log如下:
此外还有EthTSyn模块的调试log:
EthTSyn的log会在每次接收到ptp报文的时候出现,和时间同步的log没有固定的顺序关系。
MCU log说明:
“TimeKeeperRTC and TimeKeeperStbmPhc Offset” 表明 RTC 使用 Stbm(PHC) 时间同步时的offset。
“EthTsyncSlave Diff” 表示是时间同步的offset;“0: 0 0 638” 分别对应 “负数:secondsHi=0,seconds=0, nanoseconds = 638”, 即时间同步offset为-638ns。
“Stbm(PHC) Time”表示Stbm(PHC)时间;“0 1706384759 571938043” 分别对应 “secondsHi=0,seconds=1706384759, nanoseconds = 571938043”。
“Rtc Time” 表示RTC时间。
“ptp ori_t: 0 946686871s.707313482ns, cor_t: 0 0s.125718394ns” 表示从ptp报文获取的原始时间和偏移校正时间,分别对应“ptp 原始时间:secondsHi=0,seconds=946686871 nanoseconds = 707313482, 校正时间:secondsHi=0,seconds=0 nanoseconds = 125718394”。ptp的原始时间和校正时间两者之和就是ptp报文传递的真实时间。
注意,实际交付的软件不包含gPTP功能,此处EthTSync 和 Stbm(PHC)相关的打印,仅为地平线内部功能演示。
4.3.2. 时间源接入Acore的单时间域方案¶
MCU侧在Service/TimeSync/src/Hobot_TimeSync.c代码中进行如下配置修改:
MCU侧的修改需要注意 PRODUCT_IMAGE 宏的影响,详细内容请参考上述注意事项章节。
此外,还应该注意的是,此方案中MCU不应该作为Slave接入EthTSyn服务或者CanTSyn服务,否则会造成Stbm(PHC)时间异常。
目前MCU工程默认配置是作为Slave接入EthTSyn服务,因此需要在MCU侧的HorizonBswTask.c文件进行如下修改:
在Target/Target_J6PH/Target-hobot/target/HorizonBswTask.c文件(请根据具体工程查找对应路径)中删除EthTSyn_MainFunction函数。如果没有该函数请忽略即可。
刷写启动后,执行如下命令,第一条命令设置log等级,允许输出打印到控制台;第二条命令启动ptp时间同步,将外部ptp master时间同步到Acore网卡; 第三条命令将网卡时间同步到Linux系统时间;第五条命令启动时间同步程序,将Acore网卡时间同步给MCU侧RTC和Stbm(PHC)。
关键参数说明:
-p 1:同步网卡1的时间; -p 0:同步网卡0的时间(默认)
-r:将Acore网卡时间同步给MCU RTC时间
Acore时间同步log如下:
Acore log说明: “snapshot”字段为MCU网卡发出PPS秒脉冲时各个clock对应的硬件时间戳; “PPS fetch infobuf time”字段为Acore PPS驱动捕获到的系统时间; “timesync ipc send data succeed”提示说明Acore网卡时间戳成功发送给MCU,由MCU侧进行时间同步,时间同步质量在MCU侧查看。
MCU时间同步log如下:
此外还有EthTSyn模块的调试log:
EthTSyn的log会在每次接收到ptp报文的时候出现,和时间同步的log没有固定的顺序关系。需要注意的是,Acore的单时间域方案中,MCU不从EthTSyn获取时间。因此可以忽略EthTSyn的log。
MCU log说明:
“Get Time From Acore success” 表明 MCU 从 Acore 拿时间成功。
“TimeKeeperRTC and TimeKeeperIPC Offset” 与 “TimeKeeperStbmPhc and TimeKeeperIPC Offset”,分别表明在同步时,RTC 和 Stbm(PHC)分别使用IPC时间同步时的offset。
“ptp ori_t: 0 946686871s.707313482ns, cor_t: 0 0s.125718394ns” 表示从ptp报文获取的原始时间和偏移校正时间,分别对应“ptp 原始时间:secondsHi=0,seconds=946686871 nanoseconds = 707313482, 校正时间:secondsHi=0,seconds=0 nanoseconds = 125718394”。ptp的原始时间和校正时间两者之和就是ptp报文传递的真实时间。
注意,实际交付的软件不包含gPTP功能,此处EthTSyn 和 Stbm(PHC)相关的打印,仅为地平线内部功能演示。
4.3.3. 时间源接入MCU的双时间域方案¶
MCU侧在Service/TimeSync/src/Hobot_TimeSync.c代码中进行如下配置修改:
MCU侧的修改需要注意 PRODUCT_IMAGE 宏的影响,详细内容请参考上述注意事项章节。
MCU侧在Service/TimeSync/src/TimeKeeper_RTC.c代码中进行如下配置修改:
刷写启动后,执行如下命令,第一条命令设置log等级,允许输出打印到控制台。第三条命令启动时间同步程序,将MCU侧RTC时间和Stbm(PHC)时间分别同步到Acore网卡时间和系统时间。
关键参数说明:
-s 1:同步系统时间(默认); -s 0:不同步系统时间
-b:将MCU侧Stbm(PHC)时间同步到Acore Linux系统时间
-e 1:使用调频机制(默认); -e 0:使用调相机制
-p 1:同步网卡1的时间; -p 0:同步网卡0的时间(默认)
-w:设置报警误差阈值(默认值1000000,单位:ns)
-n:设置网卡时间误差的报警阈值(默认值100000,单位:ns)
Acore时间同步log如下:
Acore log说明:
“snapshot”字段为MCU网卡发出PPS秒脉冲时各个clock对应的硬件时间戳; “PPS fetch infobuf time”字段为Acore PPS驱动捕获到的系统时间; “get ipc timesync pack succeed”说明成功从MCU侧获取到IPC报文,里面包含Stbm(PHC)时间和RTC时间; “offset”字段为Acore系统时间、网卡时间与MCU侧Stbm(PHC)时间、RTC的时间差。
MCU侧进行时间同步,时间同步质量在MCU侧查看。
MCU时间同步log如下:
此外还有EthTSyn模块的调试log:
EthTSyn的log会在每次接收到ptp报文的时候出现,和时间同步的log没有固定的顺序关系。
MCU log说明:
“EthTsyncSlave Diff” 表示是时间同步的offset;“0: 0 0 148” 分别对应 “负数:secondsHi=0,seconds=0, nanoseconds = 148”, 即时间同步offset为-148ns。
“Stbm(PHC) Time”表示Stbm(PHC)时间;“0 1706307649 762085354” 分别对应 “secondsHi=0,seconds=1706307649, nanoseconds = 762085354”。
“Rtc Time” 表示RTC时间。
“Send IPC REF”表示MCU通过IPC 将Stbm(PHC)的时间发给了Acore。
“ptp ori_t: 0 946686871s.707313482ns, cor_t: 0 0s.125718394ns” 表示从ptp报文获取的原始时间和偏移校正时间,分别对应“ptp 原始时间:secondsHi=0,seconds=946686871 nanoseconds = 707313482, 校正时间:secondsHi=0,seconds=0 nanoseconds = 125718394”。ptp的原始时间和校正时间两者之和就是ptp报文传递的真实时间。
注意,实际交付的软件不包含gPTP功能,此处EthTSyn 和 Stbm(PHC)相关的打印,仅为地平线内部功能演示。
4.3.4. 时间源接入Acore,MCU使用xgmac时间的同步方案¶
MCU侧在Service/TimeSync/src/Hobot_TimeSync.c代码中进行如下配置修改:
MCU侧的修改需要注意 PRODUCT_IMAGE 宏的影响,详细内容请参考上述注意事项章节。
刷写启动后,需要确认Acore侧对应网卡已启动。如果对应网卡未启动,需要用以下命令进行启动。
MCU时间同步log如下:
此外还有EthTSyn模块的调试log:
EthTSyn的log会在每次接收到ptp报文的时候出现,和时间同步的log没有固定的顺序关系。需要注意的是,此方案中,MCU不从EthTSyn获取时间。因此可以忽略EthTSyn的log。
MCU log说明:
“TimeKeeperStbmGpt and TimeKeeperXgmacShadow Offset” 表明在同步时,Stbm(Gpt)使用xgmac时间同步时的offset。
注意,实际交付的软件不包含gPTP功能,此处EthTSyn 和 Stbm(Gpt)相关的打印,仅为地平线内部功能演示。