专栏底层软件J6X timesync sample

J6X timesync sample

新手村2026-08-17
23
0

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. 代码位置及目录结构

Acore侧timesync sample代码位于工程目录:{sdk_dir}/test/samples/platform_samples/source/S83_Sample/S83E10_Timesync/timesync_sample
MCU侧timesync sample代码位于工程目录:{mcu_dir}/mcu/Service/TimeSync

2. Acore编译

2.1. 编译环境

Acore侧本sample的编译环境使用SDK中的build工具,请参考:Build 环境建立

2.2. 编译说明

3. MCU编译

3.1. 编译环境

MCU侧本sample的编译环境使用MCU代码中的build工具,请参考:MCU代码编译指南

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)相关的打印,仅为地平线内部功能演示。

底层软件
社区征文杂谈官方教程征程6
评论0
0/600