Linux时间体系与LinuxPTP

Linux时间体系

Linux 需要提供“知道当前时间、计算时间长度、定时提醒”这三种功能。

其中知道当前时间和计算时间长度在某种程度上可以互相转换。即以UNIX Epoch计时开始可以知道当前时间。

一般硬件可以提供下列的硬件时钟:

  • RTC 【真实时钟】 对于PC而言,一般通过主板上的纽扣电池供电维护,防止断电后时间信息不对。对于嵌入式设备,我觉得一般没有使用这个时钟。RTC时钟一般需要通过IO接口读取进入Kernel,然后更新内部的时间计数器,然后在关机过程中写入。以保存时间。对于嵌入式设备,我觉得可以靠NTP之类的授时协议来更新时钟。
  • 定时器【TImer】 这个一般是定时中断,可能精度较低
  • 计时器【counter】 递增的CPU计数器 属于是寄存器。读取超级快。精度高,准确。

下面是一些常用概念:

UNIX Epoch:
UNIX诞生那一年,作为类UNIX计时的起点,即1970-01-01。

UTC:
世界协调时间,一般认为的0时区时间。计算机底层都是用UTC交互,应用层上面再加逻辑换算时区。


Linux的时间接口,会用到这些参数:

timespec:是一个结构体,内有两个参数,一个是秒,一个是纳秒。表示精度到那纳秒。

clockid:用于区分使用的不同时钟体系:

【CLOCK_REALTIME】
自然时间,也就是壁挂时钟。可设置,可跳跃。可往前可往后。
会影响到这些时间体系:CLOCK_REALTIME_ALARM(定时专用)/COARSE(粗糙读取快)/TAI(无闰)
这些不可设置。

【CLOCK_MONOTONIC】
单调递增时钟,只能往后调整,不能往前调。一般是以系统启动为起点。

【CLOCK_MONOTONIC_RAW】
不能调整。

linuxptp

查看网卡是否有ptp硬件时钟

sudo ethtool -T  网卡名 [ 如eth0 ]  

ptp4l

ptp4l is an implementation of the Precision Time Protocol (PTP) according to IEEE standard 1588 for Linux. It implements Boundary Clock (BC), Ordinary Clock (OC), and Transparent Clock (TC).

选项:

-H
使用硬件时钟
Select the hardware time stamping. All ports specified by the -i option and in the configuration file must be attached to the same PTP hardware clock (PHC). This is the default time stamping.

-S
使用软件时钟
Select the software time stamping.

-f config
指定配置文件
Read configuration from the specified file. No configuration file is read by default.

-i interface
指定ptp硬件时钟 如果不指定好像会自动选择。一般一个网卡可能也就一个硬件ptp时钟 在/dev/ptp* 可以看到
Specify a PTP port, it may be used multiple times. At least one port must be specified by this option or in the configuration file.

-s
纯纯slave模式
Enable the clientOnly mode.

-m
标准输出端口打印log
Print messages to the standard output.

配置文件示例

Automotive MasterAutomotive profile example configuration for master containing those attributes which differ from the default configuration. Refer to ptp4l(8) for the complete list of available options.
[global]
# Options carried over from gPTP.
gmCapable               1     #让本地时钟可以作为grandmaster 使用802.1AS时钟
priority1               248    #本地时钟的priority1属性。它用于PTP服务器选择算法,较低的值优先。必须在0到255之间。默认值为128。
priority2               248    #本地时钟的priority2属性。它用于PTP服务器选择算法,较低的值优先。必须在0到255之间。默认值为128。
logSyncInterval         -3
syncReceiptTimeout      3
neighborPropDelayThresh 800
min_neighbor_prop_delay -20000000
assume_two_step         1
path_trace_enabled      1
follow_up_info          1
transportSpecific       0x1
ptp_dst_mac             01:80:C2:00:00:0E
network_transport       L2
delay_mechanism         P2P
#
# Automotive Profile specific options
#
BMCA                    noop
serverOnly              1
inhibit_announce        1
asCapable               true
inhibit_delay_req       1

说实话,配置文件我没有用。目前来看指令比较简单。可能面对特殊的环境和应用需要做配置文件发布和定制。会比较好。
比如车内TSN就需要配置文件 指明使用TSN AS协议。

phc2sys(8): synchronize two or more clocks

phc2sys is a program which synchronizes two or more clocks in the system. Typically, it is used to synchronize the system clock to a PTP hardware clock (PHC), which itself is synchronized by the ptp4l(8) program.With the -a option, the clocks to synchronize are fetched from the running ptp4l daemon and the direction of synchronization automatically follows changes of the PTP port states.Manual configuration is also possible. When using manual configuration, two synchronization modes are supported, one uses a pulse per second (PPS) signal provided by the source clock and the other mode reads time from the source clock directly. Some clocks can be used in both modes, the mode which will synchronize the time sink with better accuracy depends on hardware and driver implementation.

网卡的硬件时钟是PTP,或者叫PHC。程序用的时钟是上面的CLOCK_REALTIME
phc2sys的作用就是在自己内部,不同的时钟之间做同步。

常用指令:
-a
Read the clocks to synchronize from running ptp4l and follow changes in the port states, adjusting the synchronization direction automatically. The system clock (CLOCK_REALTIME) is not synchronized, unless the -r option is also specified.
似乎是添加经由ptp4l同步的时钟(软或者硬实现同步)进入同步组。和谁同步呢,-a说是自动选择,但是我没考虑过如果不指定还能和谁同步。
这里指出了-r表示开启CLOCK_REALTIME作为同步对象。

也就是说:

phc2sys -a -r

是从ptp4l的同步时钟–同步至–》CLOCK_REALTIME

-r
Only valid together with the -a option. Instructs phc2sys to also synchronize the system clock (CLOCK_REALTIME). By default, the system clock is not considered as a possible time source. If you want the system clock to be eligible to become a time source, specify the -r option twice.

这里实际上指出要使用-rr

phc2sys -a -rr

-rr表示把系统时钟当做了时钟源,然后 CLOCK_REALTIME–同步至–>PHC

我之前测试的时候,没有在作为grandmaster的host内执行phc2sys -a -rr, 造成虽然我在host内用date修改了时间,但是slave的时间虽然运行了phc2sys -a -r也没有被修改。
甚至在slave同步成功后变成了UNXI Epoch。

总结

【grand master】

phc2sys -a -rr # sys time --> ptp clock
ptp4l -i 网卡 -H -m # 指定接口(网卡) 使用硬件时钟 打印log

【slave】

ptp4l -i 网卡 -H -m -s# -s 表示仅仅以 slave的模式执行
phc2sys -a -r# ptp clock --> sys time
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小羊苏C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值