基于Linux的嵌入式TSN网关搭建:实现工业控制网络的亚毫秒级时延保障
工业控制把标准以太网当骨干,常因拥塞、排队、软件协议栈抖动出现毫秒级波动。TSN在Linux上用“统一时钟+时间门控+优先级整形+帧抢占”把控制报文放进确定时隙,配合支持硬件时间戳的网卡/交换芯片,端到端可做到亚毫秒甚至百微秒级。
一、内核与硬件底座
先确认网卡支持TSN,而不是只装软件:
ethtool -T eth0 | grep -E "hardware-transmit|hardware-receive"
ls /dev/ptp* # 有PHC才可能亚微秒同步
ethtool -k eth0 | grep hw-tc-offload
内核开TSN相关项:802.1Qbv TAPRIO、802.1Qbu帧抢占、802.1Qav CBS、802.1AS gPTP,网卡驱动支持把GCL下放到硬件;纯软件tc只能做近似调度,达不到硬实时。 控制网关建议PREEMPT_RT,把ptp4l、taprio管理、控制收发线程绑独立核。
二、PTP统一全网时间
主钟用硬件时间戳,从钟同步PHC再同步系统:
# 主钟
ptp4l -i eth0 -m -H --masterOnly
# 从钟
ptp4l -i eth0 -m -H -s
phc2sys -s /dev/ptp0 -c CLOCK_REALTIME -w -m
# 查同步质量
pmc -u -b 0 'GET TIME_STATUS_NP' | grep offset
硬件时间戳下PHC间offset可到纳秒~百纳秒级,软件时间戳通常几十微秒甚至更差; gPTP用802.1AS、P2P延迟、L2传输最稳。 taprio的base-time必须基于PHC时间,所以先等ptp4l进入s2锁定再配门控。
三、taprio做控制报文时间窗
1ms周期示例:控制类200μs独占,其余背景800μs:
BASE=$(echo "$(date +%s) * 1000000000 + 5000000000" | bc)
tc qdisc replace dev eth0 parent root handle 100 taprio \
num_tc 3 \
map 0 0 0 0 1 1 1 1 2 2 2 2 2 2 2 2 \
queues 1@0 1@1 1@2 \
base-time $BASE \
sched-entry S 01 200000 \
sched-entry S 02 300000 \
sched-entry S 04 500000 \
flags 0x2 clockid CLOCK_TAI
num_tc 3表示控制、调度、背景三类;map把socket优先级/VLAN PCP映射到TC;flags 0x2走硬件GCL offload,门控在MAC/网卡执行,不依赖CPU软调度。 控制TC用单独队列且窗口靠前,背景流即使打满也不会抢占控制时隙。若周期更严,可把控制窗缩到100μs、加guard band防止大帧跨窗。
应用侧绑定优先级:
int prio = 6; /* 对应控制TC */
setsockopt(fd, SOL_SOCKET, SO_PRIORITY, &prio, sizeof(prio));
VLAN场景用ip把PCP映射到优先级:
ip link add link eth0 name eth0.100 type vlan id 100 egress-qos-map 6:6 0:0
四、CBS与帧抢占补抖动
音频/视频、OPC-UA历史流用CBS限带宽,避免信用整形拖控制:
tc qdisc replace dev eth0 parent 100:2 cbs \
idleslope 10000000 sendslope -990000000 \
hicredit 154 locredit -1389 offload 1
大背景帧穿越控制窗会增抖动,开802.1Qbu:
ethtool --set-mm eth0 pmac-enabled on tx-enabled on verify-enabled off
tc qdisc replace dev eth0 parent root handle 100 mqprio \
num_tc 4 map 3 3 2 1 3 3 3 3 3 3 3 3 3 3 3 3 \
queues 1@0 1@1 1@2 1@3 fp E P P P hw 1
表达队列不抢占、其余可抢占,控制小包走express,降低被大包阻塞概率。
五、交换机与Qci边界防护
Linux网关直连终端可做单跳;过工业交换机要把各端口GCL、VLAN PCP、802.1Qci逐流过滤对齐。Qci对异常广播、超时流做police,避免某个PLC疯发把控制窗占满。 配置全部进Git:网卡taprio、交换机GCL、PTP域号、VLAN、应用周期版本绑定,改一项重测一项。
六、时延验收
控制端发固定周期小包,接收端用硬件时间戳抓:
tcpdump -i eth0 -ttttt -n -e vlan -w tsn.pcap &
tc -s qdisc show dev eth0 # 看各TC丢包/超限/门控命中
cyclictest -a 2 -t1 -p90 -i1000 -d30m # 控制核调度抖动基线
统计pcap发送/接收时差,取p99、p999而非平均;背景流量压到70%带宽复测,要求控制流最大延迟仍小于设定窗宽。若超亚毫秒,按“PTP offset→taprio硬件offload是否生效→IRQ是否绑核→交换机GCL是否对齐→大帧是否未开抢占”依次排查。
按“PHC硬件同步+taprio硬件门控+CBS/MM补抖动+Qci隔离异常流+RT内核绑核”搭建,工业网关在千兆TSN域内把控制报文稳定送进百微秒~亚毫秒时隙是可复现的;若网卡不支持硬件offload或只用软件PTP,就不要承诺硬亚毫秒,只能作为软实时过渡。





