This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM6422:从"带 PRU_ICSSG 的 gPTP 双端口以太网交换机"到 gPTP 链

Guru**** 2650475 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1589095/am6422-from-gptp-with-pru_icssg-two-port-ethernet-switch-to-gptp-chain

器件型号: AM6422

你好!

我使用 4 个链式 AM64x 器件、我需要使用 gPTP 将每个器件同步到 GM。 我得到了这个解决方案、其中 1 号是使用 E2E 模式的 GM。 我无法使用 P2P 实现更小的抖动、

 image.png

PRU_ICSSG 接口连接到 ICSSG0、方式与 Phytec AM64x phyBOARD 中的方式相同。 因此、它们不能进入 CPSW3g。 该测试使用 Phytec 最新的 Yocto (25.2.0) 和几个封装来执行。 它使用 Linux 6.12.8。

-----

为了简化设置、我从 TI 记录的示例开始、希望从这种方式开始会更轻松。 工作完成后、我会回到我需要设置的链条。 这个例子对我来说不起作用、我正在描述我所做的事情。

我使用此代码在中间的节点中启动桥接器。 桥接器工作正常、如果我愿意、我可以在极端之间转发 IP 数据包、但不将其设置为 IP 桥接器。  

ip link add name br0 type bridge
ip link set dev eth1 master br0
ip link set dev eth2 master br0
ip link set dev br0 up
bridge vlan add dev br0 vid 1 pvid untagged self

然后在 gPTP 启动时、中间的节点具有更高的 (100) 优先级、如链接示例所示。 并且命令和配置与示例中的命令和配置相同。

当中间的桥接节点启动时、它将成为右侧节点的主节点、该节点在启动后立即启动(连接到 eth2)、直到左侧节点启动、同步中断。 桥接器日志:

ptp4l[1134.992]: selected /dev/ptp2 as PTP clock 
ptp4l[1135.008]: port 1 (eth1): INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[1135.032]: port 2 (eth2): INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[1135.033]: port 0 (/var/run/ptp4l): INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[1135.033]: port 0 (/var/run/ptp4lro): INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[1138.109]: port 2 (eth2): LISTENING to MASTER on ANNOUNCE_RECEIPT_TIMEOUT_EXPIRES
ptp4l[1138.109]: selected local clock 1a61e8.fffe.0e03f6 as best master
ptp4l[1138.109]: port 2 (eth2): assuming the grand master role
ptp4l[1138.946]: port 1 (eth1): LISTENING to MASTER on ANNOUNCE_RECEIPT_TIMEOUT_EXPIRES
ptp4l[1138.946]: port 1 (eth1): assuming the grand master role
ptp4l[1138.946]: port 2 (eth2): assuming the grand master role
ptp4l[1150.515]: port 2 (eth2): new foreign master eec20f.fffe.e01eba-1


当我在另一个极端启动节点时、电桥右侧的节点开始同步并停止。

ptp4l[1153.558]: selected /dev/ptp2 as PTP clock
ptp4l[1153.570]: port 1 (eth1): INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[1153.571]: port 0 (/var/run/ptp4l): INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[1153.571]: port 0 (/var/run/ptp4lro): INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[1156.906]: port 1 (eth1): new foreign master 1a61e8.fffe.0e03f6-2
ptp4l[1157.309]: port 1 (eth1): LISTENING to MASTER on ANNOUNCE_RECEIPT_TIMEOUT_EXPIRES
ptp4l[1157.309]: selected local clock eec20f.fffe.e01eba as best master
ptp4l[1157.309]: port 1 (eth1): assuming the grand master role
ptp4l[1158.906]: selected best master clock 1a61e8.fffe.0e03f6
ptp4l[1158.906]: port 1 (eth1): MASTER to UNCALIBRATED on RS_SLAVE
ptp4l[1159.787]: port 1 (eth1): UNCALIBRATED to SLAVE on MASTER_CLOCK_SELECTED
ptp4l[1160.537]: rms 2156 max 2858 freq  -5055 +/- 1485 delay    72 +/-   0
ptp4l[1161.538]: rms  400 max  619 freq  -6371 +/- 539 delay    72 +/-   0
ptp4l[1162.538]: rms  664 max  703 freq  -7569 +/- 175 delay    72 +/-   0
ptp4l[1163.538]: rms  420 max  559 freq  -7801 +/-  18 delay    72 +/-   0
ptp4l[1164.539]: rms  136 max  225 freq  -7674 +/-  47 delay    71 +/-   0
ptp4l[1165.539]: rms   25 max   39 freq  -7532 +/-  32 delay    71 +/-   0
ptp4l[1166.539]: rms   39 max   45 freq  -7465 +/-  13 delay    71 +/-   0
ptp4l[1166.804]: port 1 (eth1): multiple peer responses
ptp4l[1166.804]: port 1 (eth1): rogue peer delay response
ptp4l[1166.804]: port 1 (eth1): SLAVE to FAULTY on FAULT_DETECTED (FT_UNSPECIFIED)
ptp4l[1182.844]: port 1 (eth1): FAULTY to LISTENING on INIT_COMPLETE
ptp4l[1183.802]: port 1 (eth1): rogue peer delay response
ptp4l[1183.802]: port 1 (eth1): LISTENING to FAULTY on FAULT_DETECTED (FT_UNSPECIFIED)
ptp4l[1199.842]: port 1 (eth1): FAULTY to LISTENING on INIT_COMPLETE
ptp4l[1200.800]: port 1 (eth1): rogue peer delay response
ptp4l[1200.800]: port 1 (eth1): LISTENING to FAULTY on FAULT_DETECTED (FT_UNSPECIFIED

 

左侧的节点在启动时不同步、只会开始产生问题。

ptp4l[1171.593]: selected /dev/ptp2 as PTP clock
ptp4l[1171.604]: port 1 (eth2): INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[1171.605]: port 0 (/var/run/ptp4l): INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[1171.605]: port 0 (/var/run/ptp4lro): INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[1174.727]: port 1 (eth2): LISTENING to MASTER on ANNOUNCE_RECEIPT_TIMEOUT_EXPIRES
ptp4l[1174.727]: selected local clock 5e17b3.fffe.d5675b as best master
ptp4l[1174.727]: port 1 (eth2): assuming the grand master role
ptp4l[1188.606]: port 1 (eth2): multiple peer responses
ptp4l[1188.606]: port 1 (eth2): received pdelay_resp msg with unexpected peer port id eec20f.fffe.e01eba-1
ptp4l[1205.607]: port 1 (eth2): multiple peer responses
ptp4l[1205.607]: port 1 (eth2): received pdelay_resp msg with unexpected peer port id eec20f.fffe.e01eba-1

 

什么是我的缺失? 谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Nelson、  

    由于我在过去几天不在办公室、所以对答复的拖延表示歉意。 为了仔细检查、您是否按照 https://software-dl.ti.com/processor-sdk-linux/esd/AM64X/latest/exports/docs/linux/pmd/PRU-ICSS/prts/PRU_ICSSG Linux_Drivers Ethernet_Switch Foundational_Components 的第 3 步中的要求添加了 mdb 条目 ?


    #Add mdb entry for switch interface with multicast mac address used for forwarding PTP packets.
    #This address is same as ptp_dst_mac field in gPTP.cfg file.
    bridge mdb add dev br0 port br0 grp $ptp_dst_mac permanent vid 1


    要使 PTP 在已配置为交换机的 ICSSG 以太网接口上运行、需要执行此步骤。

    -道林
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我真的很想念这一个,它就在那里。 感谢您的帮助。 我把案文与评论混淆了。

    所以、我让它可以正常工作。 #Get 1 作为 GM、其他人与之同步。

    我做了一个小实验,生成从#4 到#1 的流量。 速度为 0200 和 600 Mbit/s 这些图形来自#4 的日志。 到目前为止看起来不错。

    是否建议从较长链中的流量重新同步? 当我得到 600mbit 同步#4 被中断了几次。

    此致。

    从发送流量 (uSiP、iperf3) 时节点 4 的日志获取的图形。 首先是 0mbit/s、然后是 200mbit/s、然后是 600mbit/s

    200mbit/s



  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Nelson:  

    所以、我得到了这个工作。 #Get 1 作为 GM、其他与 GM 同步。

    很高兴听到它现在对您有用!

    发送流量时从节点#4 的日志中获取的图形 (USP、iperf3)。 第一个 0mbit/s、然后是 200mbit/s、然后是 600mbit/s。

    为了澄清一下、我是否理解您的测试、您正在后台运行 iperf3 生成的流量、同时运行 ptp4l、它发送 PTP 流量、并绘制 PTP 同步在不同 iperf3 流量速率下的样子吗?

    是否建议从较长链中的通信中重新同步? 当我得到 600mbit 同步#4 被中断了几次。[/报价]

    当您的 PTP 流量处于 0mbits/sec、200mbits/sec、600mbit/s 时、您能否检查 CPU 负载是什么样子?

    一个建议是尝试实施 EST 计划、以便您可以优先处理/安排 PTP 流量和/或其他关键流量、使其通过任何其他非关键流量发送。  https://osseu2025.sched.com/event/25Vx1/setting-up-real-time-ethernet-and-tsn-with-linux-a-10-step-guide-jan-altenberg-open-source-automation-development-lab-osadl-eg 显示了有关此类设置的一些信息。  

    另一个我还没有研究自己的想法是写一个 eBPF 程序、该程序使用 XDP 框架来过滤 PTP 流量、并减少任何可能占用大量 CPU 负载的高带宽后台流量、这可能会影响正在处理的其他关键/PTP 流量。

    -道林

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、道林!

    您对图表感到满意。

    下面我快速捕捉了几个比特率。

    0mbits/s 0.5% CPU

    200mbit/s、33% CPU (0% UDP 数据包丢失)

    300mbit/s、50% CPU(0.31% UDP 数据包丢失)

    400mbit/s、56% CPU(丢失 4.6%的 UDP 数据包)

    500mbit/s、63% CPU(5.4% UDP 数据包丢失)

    600mbit/s、71% CPU (丢失 8%的 UDP 数据包)


    200mbit/s 在这一链中看起来可靠。

    我需要检查 EST。 我已经尝试过、但我发现 PRU 文档 将我发送到 其他文档有点混淆 、这些文档的接口连接到内部开关(不是我的情况)、并且这些命令似乎对我不起作用。

    root@phyboard-Electra-am64xx-2:~# ifconfig eth2 down
    root@phyboard-Electra-am64xx-2:~# ethtool -L eth2 TX 3.
    root@phyboard-Electra-am64xx-2:~# ethtool --set-priv-flags eth2 p0-rx-ptype-rbytion off
    NetLink 错误:操作不受支持
    root@phyboard-Electra-am64xx-2:~# ifconfig eth2 up

    root@phyboard-Electra-am64xx-2:~# base=$((`date +%s`+ 2 * 60)*1000000)
    root@phyboard-Electra-am64xx-2:~# tc qdisc replace dev eth2 父根句柄 100 taprio num_tc 3 map 0 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 队列 1@0
    1@1 1@2 base-time $base sched-entry S 4 125000 sched-entry S 2 125000 sched-entry S 1 250000 标志 2.
    错误:设备不支持 taprio 卸载。
    root@phyboard-Electra-am64xx-2:~#

    此致。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Nelson:

    [引述 userid=“578801" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1589095/am6422-from-gptp-with-pru_icssg-two-port-ethernet-switch-to-gptp-chain/6129642

    0mbits/s 0.5% CPU

    200mbit/s、33% CPU (0% UDP 数据包丢失)

    300mbit/s、50% CPU(0.31% UDP 数据包丢失)

    400mbit/s、56% CPU(丢失 4.6%的 UDP 数据包)

    500mbit/s、63% CPU(5.4% UDP 数据包丢失)

    600mbit/s、71% CPU (丢失 8%的 UDP 数据包)

    [/报价]

    感谢您分享这些数据、CPU 负载的比特率行为与我预期的一样。 在您的测试中、目标是防止 UDP 数据包丢失还是防止 PTP 数据包丢失?

    root@phyboard-Electra-am64xx-2:~# ethtool --set-priv-flags eth2 p0-rx-type-rcrobin off
    NetLink 错误:操作不受支持 [/报价]

    文档未能提及的一个步骤是、必须关闭 EVM 上的所有可用接口以关闭 p0-rx-ptype-rrobin、因此除了 eth2 之外、还必须在 关闭 p0-rx-ptype-rrobin 之前关闭其他接口。  

    EST 的常见问题解答也可能会有所帮助。 虽然它重点介绍了具有 CPSW 接口的 EST、但我的理解是它应该与 PRU-ICSSG 接口的设置步骤类似: https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1456480/faq-how-to-set-up-enhancements-for-scheduled-traffic-est-time-aware-shaper-tas-in-linux 

    -道林

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Daolin。

    避免 PTP 数据包丢失是优先事项。

    关于 TSN、我还不够了解、无法掌握针对 PRU-ICSSG 接口调整文档所需的知识、但正在研究这些文档。 当我尝试时,我被卡住了,但我不得不说,我真的不知道我在做什么。 我现在无法做到、但我将学习您在本主题早期分享的视频。 我想明年我会把这项任务交给我。

    我对 gPTP/P2P 的工作原理很满意。 下一层幸福感是得到一个流量控制命令,对我来说不会失败:-) 因为链中的想法是不会使它与流量饱和,因为还有其他节点,也许用户空间流量控制也可以工作。

    此致。

    ~# IP link set End1 down
    Δ~# ethtool --set-priv-flags end1 p0-rx-ptype-rrobin off
    NetLink 错误:操作不受支持
    ~# IP link set End1 up    

    ~# mii-tool End1
    结束:协商 1000BaseT-FD、链路正常
    ~# IP link set End1 down    
    ~# ethtool -L End1 TX 4
    ~# IP link set End1 up    
    ~#睡眠 5.
    ~# tc qdisc replace dev End1 父根手柄 100 taprio \
      num_tc 4 \
      映射 0 1 2 3 0 0 0 0 0 0 0 0 0 0 0 0 \
      队列 1@0 1@1 1@2 1@3 \
      基准时 0 \
      周期时间 1000000 \
      Sched-Entry S 2 20000 \
      Sched-Entry S 1 980000 \
      标志 2
    错误:设备不支持 taprio 卸载

    ~# IP link set End1 down
    ~# ethtool -L End1 TX 3
    ~# IP link set End1 up
    ~#睡眠 5.
    ~# tc qdisc add dev End1 父根句柄 100: mqprio num_tc 3 \
    映射 0 0 0 0 0 0 0 1 2 0 0 0 0 0 0 0 0 \
    队列 1@0 1@6 1@7 HW 1 模式通道\
    Shaper bw_rlimit min_rate 0 212mbit 106mbit max_rate 0 250mbit 150mbit

    错误:设备不支持硬件卸载。

    -----

    我们使用 eth0 进行了快速 TSN 测试... 这对我们来说是没有问题的。

    ~# tc qdisc add dev eth0 parent root handle 100: mqprio num_tc 3 \
    map 0 0 0 0 0 0 1 2 0 0 0 0 0 0 0 0 \
    queues 1@0 1@6 1@7 hw 1 mode channel \
    shaper bw_rlimit min_rate 0 212mbit 106mbit max_rate 0 250mbit 150mbit
    
    ~# echo 106 > /sys/class/net/eth0/queues/tx-7/tx_maxrate
    ~# echo 212 > /sys/class/net/eth0/queues/tx-6/tx_maxrate
    
    ~# tc qdisc add dev eth0 clsact
    ~# tc filter add dev eth0 egress protocol ip prio 1 u32 match ip dport 5001 0xffff action skbedit priority 7
    ~# tc filter add dev eth0 egress protocol ip prio 1 u32 match ip dport 5002 0xffff action skbedit priority 6