簡介
IEEE 802.1 TSN(Time-Sensitive Networking)工作組定義了一個基于802.x網絡架構上提供同步時間低延遲服務能力的協議,其前身為IEEE AVB(Audio Video Bridgin)工作組,后于2012年重命名為TSN工作組以便于將相關協議標準更廣泛推廣;AVB/TSN包含多種具體協議標準(見如下表格),其中最重要的協議標準之一就是IEEE 802.1AS時鐘同步協議標準,它基于IEEE 1588協議進行精簡和修改,也稱為gPTP協議。
PTP協議是一種精確的時間同步協議,IEEE 1588標準為時鐘分配定義了一個主從式架構,由一個或多個網段及一個或多個時鐘組成。在局域網中能將時間同步精度控制在亞微秒級。PTP協議對時間戳在MAC層進行加蓋, 消除了數據包在網絡協議棧中的處理時間延遲; 對時間戳的記錄和發送進行確認, 得到數據包準確的發送和接收時間。 相比于其它時間同步協議(如NTP),PTP協議的同步精度是最高的。
本文就基于NXP最新的i.MX8系列ARM處理器平臺進行TSN時鐘同步的簡單測試。
本文所演示的平臺來自于ToradexVerdin iMX8M Plus和ApalisiMX8嵌入式平臺,這兩個平臺是基于近年發布的NXP iMX8系列ARM處理器,核心為Cortex-A53/A72。
2).硬件準備
a).Verdin iMX8MP ARM核心版配合Dahlia Carrier Board載板,并連接調試串口,后續測試中作為TSN網絡中的Master Clock節點平臺。Verdin iMX8MP核心板板載PHY芯片的一路千兆網絡是完整支持包括TSN/AVB/IEEE1588等相關協議標準的網口,另外一路RGMII接口的MAC則支持AVB/IEEE1588。
b).Apalis iMX8 ARM核心版配合Apalis Eva Board載板,并連接調試串口,后續測試中作為TSN網絡中的Slave Clock節點平臺。Apalis iMX8核心板提供的兩路千兆網絡都是只支持AVB/IEEE1588,而不支持完整的TSN,不過由于本文僅測試時鐘同步因此也可以正常和Verdin iMX8MP搭配使用。
c).兩個平臺的千兆網口通過一根網線直通連接。
3).軟件準備
a).如下圖,Toradex Verdin iMXMP模塊標準Ycoto Linux BSP中已經包含了測試IEEE 802.1AS時鐘同步的Linuxptp工具,可以參考這里說明分別在Verdin iMX8MP模塊以及Apalis iMX8模塊上面安裝目前最新的LTS 5.7.2版本。
b).如果需要在本文基礎上進一步測試IEEE 802.1Qav/Qbu/Qbv等隊列轉發協議,則需要如下方式在Ycoto編譯環境或者Linux BSP Runtime環境手動安裝ipoute2-tc工具軟件,并且可能需要對Linux Kernel/Device Tree做適當的修改,可以參考這里一個NXP Application Note文章說明。
---------------------------------------
### Ycoto Environment ###
# Add below to
IMAGE_INSTALL_append = " iproute2-tc"
### Linux BSP Runtime ###
$ opkg install iproute2-tc_5.5.0-r0_aarch64.ipk
---------------------------------------
3).具體測試流程
a).Toradex Ycoto Linux默認使能了NTP時間同步協議,這是目前應用最為廣泛的網絡時間同步協議,精度可以達到毫秒級別,在大多數對于時間同步精度要求沒有那么高的場景都可以應用,本文為了測試gPTP高精度時間同步,具體測試過程中需要關閉NTP服務,詳細步驟后續說明會提供。
b).實際的TSN網絡中,Master Clock節點通常會產生一個高精度時鐘,來源一般是GNSS(Global Navigation Satellite System) 結合PPS(Pulse?Per?Second)信號來進行衛星授時,本文重點不在于此,因此對于作為Master Clock節點的Verdin iMX8MP設備在安裝好Linux系統后,先僅只通過默認開啟的NTP服務來進行System Clock的同步校準,來簡單替代衛星授時的功能。
./ NTP服務詳細配置方法可以參考這里,首先在Verdin iMX8MP Linux下完成NTP時間同步。
---------------------------------------
### NTP同步完成前的狀態信息###
root@verdin-imx8mp-07250979:~#timedatectl
Local time: Thu 2023-03-16 04:20:08 UTC
Universal time: Thu 2023-03-16 04:20:08 UTC
RTC time: Thu 2023-03-16 04:20:07
Time zone: Universal (UTC, +0000)
System clock synchronized: no
NTP service: active
RTC in local TZ: no
### NTP同步完成后的狀態信息###
root@verdin-imx8mp-07250979:~#timedatectl
Local time: Thu 2023-03-16 06:12:27 UTC
Universal time: Thu 2023-03-16 06:12:27 UTC
RTC time: Thu 2023-03-16 06:12:28
Time zone: Universal (UTC, +0000)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no
---------------------------------------
./同步完成后關閉NTP服務
---------------------------------------
root@verdin-imx8mp-07250979:~# timedatectl set-ntp false
root@verdin-imx8mp-07250979:~# timedatectl
Local time: Thu 2023-03-16 06:17:49 UTC
Universal time: Thu 2023-03-16 06:17:49 UTC
RTC time: Thu 2023-03-16 06:17:50
Time zone: Universal (UTC, +0000)
System clock synchronized: yes
NTP service: inactive
RTC in local TZ: no
---------------------------------------
b). Verdin iMX8MP Master Clock節點上面通過linuxptp工具來配置gPTP服務
./主要使用的工具如下
ptp4l: daemon that synchronizes the PTP Hardware Clock (PHC) from the NIC
phc2sys: daemon that synchronizes the PHC and the System clock
pmc: utility tool to configure ptp4l in run-time
./首先后臺加載ptp4l daemon進程,用于同步PHC
---------------------------------------
root@verdin-imx8mp-07250979:~# ptp4l -i eth0 -f ./gPTP.cfg --step_threshold=1 -m &
[1] 1092
ptp4l[1140.933]: selected /dev/ptp0 as PTP clock
root@verdin-imx8mp-07250979:~# ptp4l[1140.972]: port 1: INITIALIZING to LISTENING on INIT_COMPLE
TE
ptp4l[1140.972]: port 0: INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[1144.641]: port 1: LISTENING to MASTER on ANNOUNCE_RECEIPT_TIMEOUT_EXPIRES
ptp4l[1144.641]: selected local clock 00142d.fffe.6ea423 as best master
ptp4l[1144.641]: assuming the grand master role
---------------------------------------
//參數說明如下,更多參數選項以及詳細說明可以查看ptp4l manpage
-f選項指定gPTP.cfg配置文件,這個文件用于配置ptp4l工作于gPTP模式的設置參數
-i選項指定ptp4l所要控制的NIC網口界面
--step_threshold選項用于配置步進時鐘的閾值,超過閾值,直接調整時鐘時間,單位秒
-m參數使能log信息打印輸出,這個可以視測試需要打開或者關閉
// Master所需的gPTP.cfg文件如下,更詳細的配置文件參考說明和模板可以參考這里。需要主要目前Linux系統里面的linuxptp軟件版本是2.0.1,請查看對應branch的信息。
---------------------------------------
#
# 802.1AS example configuration containing those attributes which
# differ from the defaults. See the file, default.cfg, for the
# complete list of available options.
#
[global]
gmCapable 1
priority1 248
priority2 248
logAnnounceInterval 0
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
masterOnly 1
---------------------------------------
//默認情況下,ptp4l通過BMCA(Best Master Clock Algorithm) 來判定當前PHC是否可以被作為Grand Master職責,也可以通過masterOnly或者slaveOnly參數來強制指定,本文使用后者。
---------------------------------------
ptp4l[1144.641]: selected local clock 00142d.fffe.6ea423 as best master
ptp4l[1144.641]: assuming the grand master role
---------------------------------------
./ PHC同步完成后,接下來進行System Clock同步,這個步驟主要針對那些依賴于System clock工作的應用,比如ALSA/GStreamer frameworks AVTP插件。
//由于PHC時間采用TAI(International Atomic Time) 標準,而System Clock采用(Coordinated Universal Time) 標準,需要通過pmc runtime工具配置相應的轉換參數
---------------------------------------
root@verdin-imx8mp-07250979:~# pmc -u -b 0 -t 1 "SET GRANDMASTER_SETTINGS_NP clockClass 248 \
clockAccuracy 0xfe offsetScaledLogVariance 0xffff \
currentUtcOffset 37 leap61 0 leap59 0 currentUtcOffsetValid 1 \
ptpTimescale 1 timeTraceable 1 frequencyTraceable 0 \
timeSource 0xa0"
sending: SET GRANDMASTER_SETTINGS_NP
ptp4l[3021.662]: selected local clock 00142d.fffe.6ea423 as best master
00142d.fffe.6ea423-0 seq 0 RESPONSE MANAGEMENT GRANDMASTER_SETTINGS_NP
clockClass 248
clockAccuracy 0xfe
offsetScaledLogVariance 0xffff
currentUtcOffset 37
leap61 0
ptp4l[3021.662]: assuming the grand master role
leap59 0
currentUtcOffsetValid 1
ptpTimescale 1
timeTraceable 1
frequencyTraceable 0
timeSource 0xa0
---------------------------------------
//然后通過phc2sys工具來同步PHC和System Clock
---------------------------------------
root@verdin-imx8mp-07250979:~# phc2sys -s eth0 -c CLOCK_REALTIME --step_threshold=1 --transportSpecific=1 -w -m &
[2] 1058
phc2sys[600.436]: CLOCK_REALTIME phc offset 37000001087 s0 freq +0 delay 875
phc2sys[601.437]: CLOCK_REALTIME phc offset 37000001117 s1 freq +30 delay 875
phc2sys[602.437]: CLOCK_REALTIME phc offset -75 s2 freq -45 delay 875
phc2sys[603.437]: CLOCK_REALTIME phc offset 30 s2 freq +37 delay 875
phc2sys[604.437]: CLOCK_REALTIME phc offset -58 s2 freq -42 delay 875
---------------------------------------
//參數說明如下,更多參數選項以及詳細說明可以查看ptp4l manpage
-s選項指定來自于對應NIC(eth0) 設備的PHC作為master clock
-c選項指定System Clock作為slave clock
--step_threshold選項用于配置步進時鐘的閾值,超過閾值,直接調整時鐘時間,單位秒
--transportSpecific選項在基于gPTP domain運行是必要選項
-w參數使得phc2sys處于等待狀態直到ptp4l完成同步
-m參數使能log信息打印輸出,這個可以視測試需要打開或者關閉
//打印的log信息中,當phc offset小于100ns即表示時鐘同步成功
c). Apalis iMX8 Slave Clock節點上面通過linuxptp工具來配置gPTP服務,具體的流程和命令和Master一致,只是在gPTP.cfg配置文件中將masterOnly修改未slaveOnly。
./首先由于是Slave節點設備,保持Linux System Clock為系統安裝后的默認時間設置,直接關閉NTP服務不進行任何時間同步操作
---------------------------------------
root@apalis-imx8-07308034:~# timedatectl
Local time: Wed 2023-03-01 07:21:21 UTC
Universal time: Wed 2023-03-01 07:21:21 UTC
RTC time: Wed 2023-03-01 07:21:21
Time zone: Universal (UTC, +0000)
System clock synchronized: no
NTP service: inactive
RTC in local TZ: no
---------------------------------------
./通過和Verdin iMX8MP設備的直連網絡和Master Clock同步PHC時間,由于gPTP協議都是基于MAC層的,因此網口無需設置IP地址也沒有問題。
---------------------------------------
root@apalis-imx8-07308034:~# ptp4l -i eth0 -f ./gPTP.cfg --step_threshold=1 -m &
[1] 28567
ptp4l[2838.949]: selected /dev/ptp0 as PTP clock
root@apalis-imx8-07308034:~# ptp4l[2838.996]: port 1: INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[2838.996]: port 0: INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[2842.064]: selected local clock 00142d.fffe.6f8302 as best master
ptp4l[2842.197]: port 1: new foreign master 00142d.fffe.6ea423-1
ptp4l[2844.197]: selected best master clock 00142d.fffe.6ea423
ptp4l[2844.197]: updating UTC offset to 37
ptp4l[2844.197]: port 1: LISTENING to UNCALIBRATED on RS_SLAVE
ptp4l[2845.348]: port 1: UNCALIBRATED to SLAVE on MASTER_CLOCK_SELECTED
ptp4l[2845.973]: rms 646417001599952 max 1292834003200590 freq +9621 +/- 3636 delay 668 +/- 0
ptp4l[2846.973]: rms 8 max 10 freq +10997 +/- 6 delay 668 +/- 0
ptp4l[2847.974]: rms 9 max 10 freq +11008 +/- 1 delay 668 +/- 0
ptp4l[2848.974]: rms 4 max 6 freq +11006 +/- 3 delay 668 +/- 0
......
---------------------------------------
//打印log信息中,rms為PHC和Grand Master clock之間offset的平方值,當rms輸出持續小于100ns時候,表示同步成功。
//同時在Verdin iMX8MP的Master端,ptp4l也會打印如下信息,證明Slave以及連接Master 進行精準時間同步。
---------------------------------------
ptp4l[4137.874]: port 1: link up
ptp4l[4137.924]: port 1: FAULTY to LISTENING on INIT_COMPLETE
ptp4l[4141.728]: port 1: LISTENING to MASTER on ANNOUNCE_RECEIPT_TIMEOUT_EXPIRES
ptp4l[4141.728]: selected local clock 00142d.fffe.6ea423 as best master
ptp4l[4141.728]: assuming the grand master role
---------------------------------------
//此時查看System Clock還是未同步的時間
---------------------------------------
### synchronous System clock on Verdin iMX8MP ###
root@verdin-imx8mp-07250979:~# date +%Y-%m-%d' '%H:%M:%S.%N | cut -b 1-25
2023-03-16 08:01:22.94530
### non- synchronous System clock on Apalis iMX8 ###
root@apalis-imx8-07308034:~# date +%Y-%m-%d' '%H:%M:%S.%N | cut -b 1-25
2023-03-01 08:02:46.75497
---------------------------------------
./通過phc2sys工具來同步PHC和System Clock
---------------------------------------
root@apalis-imx8-07308034:~# phc2sys -s eth0 -c CLOCK_REALTIME --step_threshold=1 --transportSpecific=1 -w -m &
[2] 15230
phc2sys[1487.465]: CLOCK_REALTIME phc offset -1295917493725168 s0 freq +0 delay 2625
phc2sys[1488.466]: CLOCK_REALTIME phc offset -1295917493714065 s1 freq +11096 delay 2625
phc2sys[1489.466]: CLOCK_REALTIME phc offset -64 s2 freq +11032 delay 2625
phc2sys[1490.467]: CLOCK_REALTIME phc offset -71 s2 freq +11006 delay 2624
phc2sys[1491.467]: CLOCK_REALTIME phc offset 34 s2 freq +11090 delay 2625
---------------------------------------
//打印log信息中phc offset小于100ns即表示時鐘同步成功
//此時查看System Clock則已經和Grand Master同步
---------------------------------------
### synchronous System clock on Verdin iMX8MP ###
root@verdin-imx8mp-07250979:~# date +%Y-%m-%d' '%H:%M:%S.%N | cut -b 1-25
2023-03-16 08:07:39.33336
### synchronous System clock on Apalis iMX8 ###
root@apalis-imx8-07308034:~# date +%Y-%m-%d' '%H:%M:%S.%N | cut -b 1-25
2023-03-16 08:07:40.54055
---------------------------------------
d).另外為了更方便的測試PHC和System Clock是否同步成功,可以使用check_clocks工具,下載源碼后參考這里說明用如下命令進行交叉編譯,生成可執行文件在設備Linux下運行驗證時鐘同步情況
---------------------------------------
### compile binary on developing host ###
$ ${CROSS_COMPILE}gcc -o check_clocks check_clocks.c
### check on Verdin iMX8MP Master ###
root@verdin-imx8mp-07250979:~# ./check_clocks -v -d eth0
Dumping timestamps and deltas
rt tstamp: 1678954738288637418
tai tstamp: 1678954775288637543
phc tstamp: 1678954775288641175
rt latency: 125
tai latency: 125
phc latency: 1860
phc-rt delta: 37000003757
phc-tai delta: 3632
Clocks on this system are synchronized :)
### check on Apalis iMX8 Slave ###
root@apalis-imx8-07308034:~# ./check_clocks -v -d eth0
Dumping timestamps and deltas
rt tstamp: 1678954739151415597
tai tstamp: 1678954776151415847
phc tstamp: 1678954776151421106
rt latency: 125
tai latency: 250
phc latency: 3468
phc-rt delta: 37000005509
phc-tai delta: 5259
Clocks on this system are synchronized :)
---------------------------------------
5).總結
本文基于NXP iMX8系列處理器簡單演示了TSN通過gPTP協議進行網絡時間同步的機制。
審核編輯:黃飛
-
處理器
+關注
關注
68文章
19167瀏覽量
229153 -
NXP
+關注
關注
60文章
1267瀏覽量
183309 -
Linux
+關注
關注
87文章
11230瀏覽量
208932 -
網絡時鐘
+關注
關注
0文章
9瀏覽量
6805 -
TSN
+關注
關注
3文章
238瀏覽量
16816
發布評論請先 登錄
相關推薦
評論