赛灵思 TSN 解决方案

2023-10-14 20:10
文章标签 解决方案 tsn 赛灵思

本文主要是介绍赛灵思 TSN 解决方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

赛灵思 TSN 解决方案

    • 赛灵思 TSN IP 支持
    • 软件支持
    • 内核配置
    • 设备树
    • TSN系统
    • 流量类
    • PCP 和流量等级
    • 生成 TSN 流量:
    • Converting Legacy Applications to TSN
    • 支持的 PTP 配置文件
    • zynqmp 中 R5 上的 PTP 卸载
    • 运行 gPTP(802.1AS):
    • 运行 PTP 1588v2:
    • 运行 Qbv/Time Aware Shaper:
      • 使用 Wireshark 进行测试:
    • 运行 IPIC:
    • 演示抢占的步骤
    • Running Spanning Tree Protocol
    • 时间感知 DMA (TADMA)
    • OOB 脚本
      • 如何运行
    • 常见问题 (FAQ)
        • Qbv 不起作用 - 使用 qbv_sched 实用程序对 qbv 进行编程后,属于 ST 的数据包不会在指定窗口通过。
        • PTP 时钟总是从 1970 年 1 月 1 日开始。这导致我们的 CNC 出现异常。
        • Qbv 行为不同于 EP+Switch 设计中的 ep 和 temac1/temac2 实例
        • tsn_talker 在 EP+Switch 设计的 eth1 或 eth2 上不能正确运行
        • tsn_talker 传输乱码帧
        • 在 TSN Yocto 版本之外编译 TSN 驱动程序
        • 当主机重启时,从机上的 PTP 与主机失去同步
        • 如何在 EP+Switch 设计上运行 PTP 边界时钟
        • TADMA + Qbv doesn't work - After programming tadma using tadma_prog and qbv using qbv_sched utility, packets belonging to ST don't come through at specified window.
        • 当前的 TSN 设计使用 PS (Zynq Ultrascale+) 上可用的所有 16 个 PL-PS 中断(IRQ0 和 IRQ1)。我们还有其他一些 PL 模块,它们具有需要连接到 PS 的中断。
    • 使用 AXI 中断控制器的 TSN 设计
      • 用法
      • 设备树生成问题
    • 主线状态
    • 已知问题和故障排除
    • 变更日志

时间敏感网络 (TSN) 是 IEEE 802.1 工作组的时间敏感网络任务组正在开发的一组标准。

赛灵思 TSN IP 支持

  • 使用 IEEE 802.1AS 增强时间同步
  • 以太网 AVB(音频视频桥接,IEEE 802.1Qav)
  • 帧复制和消除可靠性 IEEE 802.1CB
  • 预定流量的增强功能 IEEE 802.1Qbv
  • 每流过滤和管制,IEEE 802.1 Qci
  • 增强和性能改进,IEEE 802.1Qcc
  • 帧抢占,IEEE 802.1Qbu
  • 穿插快速流量,IEEE 802.3br

软件支持

Xilinx Linux 暂存区目前支持 TSN 内核驱动程序: https://github.com/Xilinx/linux-xlnx/tree/xilinx-v2022.1/drivers/staging/xilinx-tsn

提供 TSN 用户空间实用程序和示例配置以启用 TSN 功能。有关详细信息,请参阅 TSN SW 用户指南和以下部分。

内核配置

为了构建 TSN 子系统,应启用以下配置选项:

CONFIG_XILINX_TSN

CONFIG_AXIENET_HAS_TADMA

CONFIG_XILINX_TSN_PTP

CONFIG_XILINX_TSN_QBV

CONFIG_XILINX_TSN_SWITCH

CONFIG_XILINX_TSN_QCI

CONFIG_XILINX_TSN_CB

CONFIG_XILINX_TSN_QBR

TSN 子系统需要/选择以下附加配置:

CONFIG_NET_SWITCHDEV

CONFIG_STP

CONFIG_NETFILTER

设备树

TSN 子系统 DT 文档可在此处找到:Documentation/devicetree/bindings/staging/net/xilinx_tsn.txt

对于 TSN TEMAC,请参考 Documentation/devicetree/bindings/staging/net/xilinx-tsn-ethernet.txt

TSN Switch请参考Documentation/devicetree/bindings/staging/net/xilinx_tsn_switch.txt

对于 TSN 端点,请参考 Documentation/devicetree/bindings/staging/net/xilinx_tsn_ep.txt

对于 TSN 扩展端点,请参考 Documentation/devicetree/bindings/staging/net/xilinx_tsn_ep_ex.txt

请参阅 PL 以太网和 DMA 文档以获取更多信息:Documentation/devicetree/bindings/net/xilinx_axienet.txt

有关 phy 绑定的更多详细信息,请参阅“Documentation/devicetree/bindings/net/phy.txt”

TSN系统

  • Xilinx的TSN IP Switch有三个端口Endpoint(端口0)、MAC1(端口1)和MAC2(端口2)
  • 端点连接到 MCDMA(多通道 DMA),每个 MCDMA 通道是每种类型流量的专用通道,即 Best Effort、Scheduled Traffic 和 Reserved。可能还有其他用例,其中会有单独的管理流量通道
  • MAC1通过PHY1与外界相连
  • MAC2通过PHY2与外界相连
    在这里插入图片描述
    在这里插入图片描述

流量类

​ TSN IP 支持两种配置:
a. 3 queue or 3 traffic class system:

     1. Best Effort2. Scheduled3. Reserved

b. 2 queue/2 traffic class system

	  1. Best Effort2. Scheduled

PCP 和流量等级

以太网帧的 vlan pcp 用于 HW 识别流量类别。默认情况下,4 的 pcp 映射到 ST,2 和 3 的 pcp 映射到 RES(保留)。如果 pcp 是任何其他的或者如果 frame 没有 vlan 标记,则它被认为是 BE。

2019.x 及更早版本:

这个默认映射可以通过 uEnv.txt 中的内核命令行选项更改。

   bootargs=console=ttyPS0,115200 xilinx_tsn_ep.st_pcp=5 xilinx_tsn_ep.res_pcp=2,3 root=/dev/mmcblk0p2 rw rootwait earlyprintk

2020.x 及更高版本:
boot.scr 中的参数确定 PCP 映射。默认值与上述相同。

要更改 PCP,请编辑文件 < TOP_DIR >/sources/meta-xilinx-tsn/recipes-bsp/u-boot/uboot-zynq-scr/boot.cmd.sd . < boardname >。
例如,以下命令行将 1 的 pcp 映射到 ST 流量,4 的 pcp 映射到 RES 流量,其余的 pcp 映射到 BE 流量:

bootargs=console=ttyPS0,115200 xilinx_tsn_ep.st_pcp=1 xilinx_tsn_ep.res_pcp= 4
root=/dev/mmcblk0p2 rw rootwait earlyprintk

以下命令行将 2 和 3 的 pcp 映射到 ST 流量,1 的 pcp 到 RES 流量,其余的 pcp 到 BE 流量。

bootargs=console=ttyPS0,115200 xilinx_tsn_ep.st_pcp=2,3 xilinx_tsn_ep.res_pcp=1
root=/dev/mmcblk0p2 rw rootwait earlyprintk

更改 PCP 值后,获取 bitbake 环境并再次运行 bitbake 构建:

#source setupsdk
#bitbake core-image-minimal

注意: 不要直接编辑 boot.scr 文件。

生成 TSN 流量:

生成 TSN 流量,可以通过使用原始套接字来完成,您可以在其中使用相关 pcp 创建以太网帧。一种这样的实现是作为 TSN Yocto 软件版本的一部分提供的 tsn_talker。

Converting Legacy Applications to TSN

有时,用户需要端口遗留应用程序来发送/接收 TSN 流量,而无需更改/修改它们。例如,仅使用 L3 层 (IP) 进行通信的应用程序不应具有将 pcp/vlan 插入帧的能力。为解决这个问题,Xilinx TSN 解决方案具有 IP 拦截内核模块支持,可将遗留应用无缝过渡到使用 TSN 技术。有关详细信息,请参阅“运行 IPIC”部分。

支持的 PTP 配置文件

TSN IP 支持以下配置文件:

    a. 1588v1 and 1588v2b. Power Profilec. 802.1ASd. 802.1ASREV

TSN 驱动程序和 SW 守护程序(ptp4l 和 openAvnu/gptp)支持可用于:

	a. 1588v2b. 802.1ASc. 802.1ASREV (并非所有功能都可用。请参阅 ptp4l/openAvnu 文档).

zynqmp 中 R5 上的 PTP 卸载

Xilinx TSN 解决方案提供在 zyng Ultrascale 平台的 RPU 上运行多个 802.1AS PTP 功能实例 (ptp4l)。这是通过将 PTP(ptp4l) 守护程序和部分 TSN IP 驱动程序移植到运行在 R5 上的 FreeRTOS 来实现的。控制路径通过 A53(主处理器)通过 OpenAMP 框架进行处理。

 这使打算完全隔离并具有弹性 PTP 功能的客户成为可能。

运行 gPTP(802.1AS):

gPTP 守护进程可以以两种方式运行。一种方法是从 OpenAvnu 运行它,另一种是从 ptp4linux 运行它。后者是首选,因为它在从站打印 rms 值以识别与主站的同步。

  • 从 OpenAvnu 运行 gPTP 守护进程:
    从 Intel 网卡 PC 机启动 gPTP daemon 如下:
  #Open-AVB/daemons/gptp/linux/build/obj/daemon_cl enp4s0 –S

从 Xilinx 板上启动 PTP 守护程序,如下所示:

#daemon_cl eth1 –S

[1] 186
ERROR at 636 in …/src/linux_hal_common.cpp: Group ptp not found, will try root (0) instead
Using clock device: /dev/ptp0
Starting PDelay
root@Xilinx-ZCU102-2016_1:~# AsCapable: Enabled
*** Announce Timeout Expired - Becoming Master
New Grandmaster “00:0A:35:FF:FE:00:01:0E” (previous “00:00:00:00:00:00:00:00”)
<< END >>

  • 从 ptp4linux 运行 gPTP 守护进程:
    从 Xilinx 板上启动 PTP 守护程序,如下所示:
#ptp4l -P -2 -H -i eth1 -p /dev/ptp0 –s -m -f /usr/sbin/ptp4l_slave.conf

从https://sourceforge.net/p/linuxptp/ 下载 PTP daemon 并在 Intel 卡 PC 中编译得到 ptp4l 二进制文件。使用 linuxptp 源代码中的 gPTP.cfg 或 default.cfg 文件。

从 Intel 卡 PC 启动 PTP 守护进程如下:(使用 PC 板上的 /usr/bin/ptp4l_master.conf)

#ptp4l -P -2 -H -i enp4s0 -p /dev/ptp0 -m -f ptp4l_master.conf

同步成功后,slave 打印的 RMS 值如下:

    root@zcu102-zynqmp:~# ptp4l -P -2 -H -i eth1 /dev/ptp0 -s -m -f /usr/sbin/ptp4l_slave.confptp4l[7940.770]: selected /dev/ptp0 as PTP clockptp4l[7940.800]: driver changed our HWTSTAMP optionsptp4l[7940.800]: tx_type   1 not 1ptp4l[7940.800]: rx_filter 1 not 12ptp4l[7940.800]: port 1: INITIALIZING to LISTENING on INITIALIZEptp4l[7940.800]: port 0: INITIALIZING to LISTENING on INITIALIZEptp4l[7948.772]: port 1: LISTENING to MASTER on ANNOUNCE_RECEIPT_TIMEOUT_EXPIRESptp4l[7948.772]: selected best master clock 000a35.fffe.00010eptp4l[7948.772]: assuming the grand master roleptp4l[7949.452]: port 1: new foreign master a0369f.fffe.684c96-1ptp4l[7953.452]: selected best master clock a0369f.fffe.684c96ptp4l[7953.452]: port 1: MASTER to UNCALIBRATED on RS_SLAVEptp4l[7953.951]: port 1: UNCALIBRATED to SLAVE on MASTER_CLOCK_SELECTEDptp4l[7954.701]: rms 1732 max 2297 freq -100287 +/- 1208 delay   509 +/-   0ptp4l[7955.701]: rms  326 max  499 freq -101341 +/- 438 delay   509 +/-   0ptp4l[7956.702]: rms  545 max  579 freq -102323 +/- 151 delay   509 +/-   0ptp4l[7957.702]: rms  343 max  463 freq -102512 +/-   9 delay   509 +/-   0ptp4l[7958.702]: rms  118 max  193 freq -102419 +/-  43 delay   509 +/-   0

注意:

  • 目前软件不支持 1 step ptp 模式
  • 可以通过更改优先级值来更改主从角色。低优先级表示它是主设备,较高优先级表示它是从设备。
  • 默认情况下 MAC 端口链路速度为 1Gbps,使用以下命令将其设置为 100Mbps,以防需要 100Mbps 设置
    #mii-tool -F 100baseTx-FD eth1

更改 ptp4l 配置文件(/usr/sbin/ptp4l_slave.conf 和 /usr/sbin/ptp4l_master.conf)参数 neighborPropDelayThresh 如下

neighborPropDelayThresh 2000 - for 100Mbps link speed
or
neighborPropDelayThresh 800 - for 1Gbps link speed

运行 PTP 1588v2:

  • PTPv2 使用最佳主时钟算法来确定网络中哪个时钟质量最高(主时钟)以创建主/从层次结构并将所有其他节点与主时钟同步。要使节点成为主节点,配置文件中的优先级字段应具有最小值。
  • PTPv2 可以在 L2 或 UDP 上运行。当通过 UDP 运行时,它可以在 ep + 交换机系统上以多播模式运行,在 ep only 系统上以多播和单播模式运行。
  • 要在 Intel Card PC 上运行,请从https://sourceforge.net/p/linuxptp/下载 PTP 守护程序并编译以获取 ptp4l 二进制文件。将主/从配置文件复制到 linuxptp 文件夹并从该文件夹启动 ptp4l 守护进程,如下所述。

要在 L2 上运行 PTPv2:
点对点(P2P)机制:

要在 zcu102 或 zc702 上作为 master 运行:

ptp4l -P -2 -H -i eth1 -p /dev/ptp0 -m -f /usr/sbin/ptp4l_master_v2_l2.conf

要在 zcu102 或 zc702 上作为从属运行:

ptp4l -P -2 -H -i eth1 -p /dev/ptp0 -m -f /usr/sbin/ptp4l_slave_v2_l2.conf

在 Intel Card PC 上作为主机运行:

ptp4l -P -2 -H -i eth1 -p /dev/ptp0 -m -f ptp4l_master_v2_l2.conf

在 Intel Card PC 上作为从机运行:

ptp4l -P -2 -H -i eth1 -p /dev/ptp0 -m -f ptp4l_slave_v2_l2.conf

端到端(E2E)机制:

要在 zcu102 或 zc702 上作为 master 运行:

ptp4l -E -2 -H -i eth1 -p /dev/ptp0 -m -f /usr/sbin/ptp4l_master_v2_l2.conf

要在 zcu102 或 zc702 上作为从属运行:

ptp4l -E -2 -H -i eth1 -p /dev/ptp0 -m -f /usr/sbin/ptp4l_slave_v2_l2.conf

在 Intel Card PC 上作为主机运行:

ptp4l -E -2 -H -i eth1 -p /dev/ptp0 -m -f ptp4l_master_v2_l2.conf

在 Intel Card PC 上作为从机运行:

ptp4l -E -2 -H -i eth1 -p /dev/ptp0 -m -f ptp4l_slave_v2_l2.conf

基于 UDP 的 PTPv2 和多播模式:

点对点(P2P)机制:

要在 zcu102 或 zc702 上作为 master 运行:

ptp4l -P -4 -H -i eth1 -p /dev/ptp0 -m -f /usr/sbin/ptp4l_master_v2_udp_multicast.conf

要在 zcu102 或 zc702 上作为从属运行:

ptp4l -P -4 -H -i eth1 -p /dev/ptp0 -m -f /usr/sbin/ptp4l_slave_v2_udp_multicast.conf

在 Intel Card PC 上作为主机运行:

ptp4l -P -4 -H -i eth1 -p /dev/ptp0 -m -f ptp4l_master_v2_udp_multicast.conf

在 Intel Card PC 上作为从机运行:

ptp4l -P -4 -H -i eth1 -p /dev/ptp0 -m -f ptp4l_slave_v2_udp_multicast.conf

端到端(E2E)机制:

要在 zcu102 或 zc702 上作为 master 运行:

ptp4l -E -4 -H -i eth1 -p /dev/ptp0 -m -f /usr/sbin/ptp4l_master_v2_udp_multicast.conf

要在 zcu102 或 zc702 上作为从属运行:

ptp4l -E -4 -H -i eth1 -p /dev/ptp0 -m -f /usr/sbin/ptp4l_slave_v2_udp_multicast.conf

在 Intel Card PC 上作为主机运行:

ptp4l -E -4 -H -i eth1 -p /dev/ptp0 -m -f ptp4l_master_v2_udp_multicast.conf

在 Intel Card PC 上作为从机运行:

ptp4l -E -4 -H -i eth1 -p /dev/ptp0 -m -f ptp4l_slave_v2_udp_multicast.conf

基于 UDP 的 PTPv2 和单播模式:

点对点(P2P)机制:

要在 zcu102 或 zc702 上作为 master 运行:

ptp4l -P -4 -H -i eth1 -p /dev/ptp0 -m -f /usr/sbin/ptp4l_master_v2_udp_unicast_p2p.conf

要在 zcu102 或 zc702 上作为从属运行:
"/usr/sbin/ptp4l_slave_v2_udp_unicast_p2p.conf"文件中的’peer_address’字段应设置为主机的IP地址。

ptp4l -P -4 -H -i eth1 -p /dev/ptp0 -m -f /usr/sbin/ptp4l_slave_v2_udp_unicast_p2p.conf

在 Intel Card PC 上作为主机运行:

ptp4l -P -4 -H -i eth1 -p /dev/ptp0 -m -f ptp4l_master_v2_udp_unicast_p2p.conf

在 Intel Card PC 上作为从机运行:
ptp4l_slave_v2_udp_unicast_p2p.conf文件中的’peer_address’字段应设置为主节点的IP地址。

ptp4l -P -4 -H -i eth1 -p /dev/ptp0 -m -f ptp4l_slave_v2_udp_unicast_p2p.conf

端到端(E2E)机制:

要在 zcu102 或 zc702 上作为 master 运行:

ptp4l -E -4 -H -i eth1 -p /dev/ptp0 -m -f /usr/sbin/ptp4l_master_v2_udp_unicast_e2e.conf

要在 zcu102 或 zc702 上作为从属运行:
/usr/sbin/ptp4l_slave_v2_udp_unicast_e2e.conf 的“UDPv4”字段应设置为主机IP地址

ptp4l -E -4 -H -i eth1 -p /dev/ptp0 -m -f /usr/sbin/ptp4l_slave_v2_udp_unicast_e2e.conf

在 Intel Card PC 上作为主机运行:

ptp4l -E -4 -H -i eth1 -p /dev/ptp0 -m -f ptp4l_master_v2_udp_unicast_e2e.conf

在 Intel Card PC 上作为从机运行:
ptp4l_slave_v2_udp_unicast_e2e.conf 的“UDPv4”字段应设置为主机IP地址

ptp4l -E -4 -H -i eth1 -p /dev/ptp0 -m -f ptp4l_slave_v2_udp_unicast_e2e.conf

同步成功后,slave 的日志如下:

ptp4l[765.873]: selected /dev/ptp0 as PTP clock
ptp4l[765.960]: driver rejected most general HWTSTAMP filter
ptp4l[765.960]: port 1: INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[765.960]: port 0: INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[772.710]: port 1: LISTENING to MASTER on ANNOUNCE_RECEIPT_TIMEOUT_EXPIRES
ptp4l[772.710]: selected local clock 000a35.fffe.00012e as best master
ptp4l[772.710]: assuming the grand master role
ptp4l[775.065]: port 1: new foreign master 000a35.fffe.00013e-1
ptp4l[779.065]: selected best master clock 000a35.fffe.00013e
ptp4l[779.065]: port 1: MASTER to UNCALIBRATED on RS_SLAVE
ptp4l[780.064]: master offset 3409342692 s0 freq      +0 path delay       396
ptp4l[781.065]: master offset 3409344460 s1 freq   +1768 path delay       396
ptp4l[782.065]: master offset       -373 s2 freq   +1395 path delay       396
ptp4l[782.065]: port 1: UNCALIBRATED to SLAVE on MASTER_CLOCK_SELECTED
ptp4l[783.065]: master offset       -333 s2 freq   +1323 path delay       396
ptp4l[784.065]: master offset       -404 s2 freq   +1152 path delay       396
ptp4l[785.065]: master offset       -381 s2 freq   +1054 path delay       396
ptp4l[786.065]: master offset       -303 s2 freq   +1017 path delay       396
ptp4l[787.065]: master offset       -297 s2 freq    +933 path delay       396
ptp4l[788.065]: master offset        -19 s2 freq   +1121 path delay       396
ptp4l[789.065]: master offset        316 s2 freq   +1451 path delay       396
ptp4l[790.065]: master offset        373 s2 freq   +1603 path delay       396

s0、s1、s2 字符串表示不同的时钟伺服状态:s0 解锁,s1 时钟步进,s2 锁定。一旦舵机处于锁定状态,时钟将不会步进(只能慢慢调整)。INITIALIZING、LISTENING、UNCALIBRATED 和 SLAVE 是一些可能的端口状态,它们在 INITIALIZE、RS_SLAVE、MASTER_CLOCK_SELECTED 事件上发生变化。主偏移值是以纳秒为单位的主偏移测量值。这已从 3409342692 减少到 -373,表示成功与主同步,将端口状态从未校准更改为从属

运行 Qbv/Time Aware Shaper:

可以使用 qbv_sched 实用程序对 Qbv 功能进行编程。

例如:

qbv_sched -c ep /tmp/abc.cfg

这使用 tmp 目录中存在的 abc.cfg 的 TSN 配置在 ep 上安排 Qbv

qbv_sched ep

这使用 /etc/qbv.cfg 中存在的默认 TSN 配置在 ep 上安排 Qbv

qbv_sched -g ep

这将返回在ep上运行的时schedule

qbv_sched -s ep -f

这将强制运行Qbv,使用tmp目录下abv.cfg的TSN配置,即使ep上的schedule 正在等待运行。

qbv_sched -c ep /tmp/abc.cfg -f

使用 Wireshark 进行测试:

配置 Qbv:
默认 TSN 配置存在于 /etc/qbv.cfg 文件中。此文件包含 QBV 门时间表。要运行 Qbv,您需要按照其中给出的说明配置此文件。要打开所有门,cycle_time 应该为 0。

例如:

qbv =
{temac1 ={start_sec = 0;start_ns = 0;cycle_time = 10000000; //cycle time is 10msgate_list_length = 2;gate_list =({state = 4;time = 100000;},{state = 1;time = 100000;});}; 
};

配置文件的“temac1”部分后,Qbv 调度程序使用 qbv_sched 实用程序在“eth1”上运行,如下所示:

# qbv_sched eth1

qbv_sched 实用程序可用于调度所有接口 ep、eth1-temac1 和 eth2-temac2

上述 Qbv 时间表打开 ST 门达 100uS,然后将其关闭。循环时间为10ms;因此,在 100uS BE 门在剩余的周期时间内保持打开状态,即使它的门时间是 100uS,因为门时间的总和不是周期时间。

要测试 TSN 功能,您需要在后台运行 PTP 并确保其正常运行且没有任何错误。PTP 开始在后台运行后,从 Xilinx HW 运行 tsn_talker 程序。在启动 tsn_talker 应用程序之前,配置开关 CAM 条目以允许相应的流量。

#switch_cam -a a0:36:9f:68:4c:96 10 swp1

添加交换机 CAM 条目,目标 MAC 为 a0:36:9f:68:4c:96,VLAN ID 为 10,端口为 swp1 (Temac1)。

#tsn_talker eth1 a0:36:9f:68:4c:96 00:0a:35:00:01:0e 10 4 1500 0 12 1000000000 1

该应用程序每1秒发送12个ST数据包,VLAN ID为10,数据包大小为1500字节。

从 Intel 卡 PC 运行 Wireshark 并观察传入的数据包。

Qbv 编程前的 Wireshark:
在这里插入图片描述
正如我们在上图中看到的,从第 106 个数据包到第 117 个数据包都是按顺序排列的,下一个数据包从下一秒开始。

Wireshark qbv编程后:

您会观察到每秒发送 12 个 ST 数据包,其中 8 个数据包在 10 毫秒的 100us 周期内发送,其余 4 个数据包在下一个周期内发送。
在这里插入图片描述
正如我们在上图中看到的,从第 4 个数据包到第 11 个数据包(8 个数据包)被顺序接收,下一个数据包在 10 毫秒延迟后开始(第 12 号数据包)。

运行 IPIC:

如果数据包的 IPv4 元组(源 IP、目标 IP、DSCP、协议、源端口号和目标端口号)匹配,IP 拦截将使用配置的源、目标 MAC 地址、VLAN ID 和 PCP 值转换传输数据包。IPIC 模块维护 IPv4 元组的哈希条目,如果传出数据包的元组数据与哈希条目的元组数据匹配,则转换 IP 流。

配置IPv4元组的匹配条件,在驱动加载时,对对应的元组数据选择’1’(设置)或’0’(未设置)其中IPv4元组顺序为’IPv4_tuple=src_ip, dest_ip, dscp, protocol, src_port , dest_port’。

例如,要过滤具有特定源 IP、源端口号和目标端口号的数据包,需要加载 IPIC 模块,如下所示:

  • insmod /lib/modules/4.14.0-xilinx-v2018.1/extra/xilinx_tsn_ip_intercept.ko IPv4_tuple=1,1,0,0,0,0

用户应用程序 ipic_prog 对 IPIC 模块进行编程,以添加对应于设置的 IPv4 元组数据的哈希条目,并在设置的 IPv4 元组数据匹配时使用提供的源、目标 MAC 地址、VLAN ID 和 PCP 值转换 IP 流。

ipic_prog的用法如下:

  • ipic_prog <add | del | flush> <src_ip> <dest_ip> <src_port> <dest_port> <src_mac> <dest_mac>

以下是添加单个条目以及删除单个条目和所有条目的示例。
Addition of Entry::

  • ipic_prog add 192.168.10.5 192.168.10.9 17 0 8000 1000 00-0a-35-00-01-0e a0-36-9f-68-4c-96 10 4

Deletion of Entry:

  • ipic_prog del 192.168.10.5 192.168.10.9 17 0 8000 1000 00-0a-35-00-01-0e a0-36-9f-68-4c-96 10 4

Deletion/Flushing of All Entries:

  • ipic_prog flush

如果要添加具有不同 IPv4 元组组合和不同翻译字段的多个条目,请为每个条目运行 ipic_prog 命令。

例如,以下命令添加两个具有相同源 IP 和不同目​​的 IP 的条目,并转换具有不同源、目的 MAC 地址和 VLAN ID 的流

  • ipic_prog add 192.168.10.5 192.168.10.9 17 0 8000 1000 00-0a-35-00-01-0e a0-36-9f-68-4c-96 10 4

在这种情况下,目标 IP 为 192.168.10.3 的数据包被转换为 VLAN-ID 99,源 MAC 地址为00:0a:35:07:89:ff,目标为 a0:36:9f:87:44 :00

如果存在与目标MAC地址和VLAN ID对应的交换机CAM条目,则转换后的IP流从网络端口发送出去。因此,请确保使用 switch_cam 命令添加 CAM 条目。

例如,对于上面添加的两个条目,switch_cam运行如下:

  • switch_cam -a a0:36:9f:68:4c:96 10 swp1
  • switch_cam -a a0:36:9f:68:4c:96 99 swp1

从板子传数据包,例如使用iperf3如下:

  • iperf3 -c 192.168.11.9
  • iperf3 -c 192.168.11.3
    确保 iperf3 服务器在接收器上运行,如下所示,并观察接收到的包含目标 MAC、源 MAC 地址和 VLAN ID 的数据包。
  • iperf3 -s
    当系统具备抢占能力时,运行openlldp检测对端帧抢占能力,如果对端具备抢占能力,则开启抢占。

运行 openlldp 如下:

  • conf/local.conf 中“EXTRA_IMAGEDEPENDS”和“IMAGE_INSTALL_append”的“lldpd”字段(假定您位于“Yocto_TSN/build”路径中)必须替换为“lldpad”,如下所示:

EXTRA_IMAGEDEPENDS += "gptp misc-utils linuxptp bridge-utils python python-json python-codecs python-io curl lldpad strace lrzsz net-tools tcpdump netcat iperf3 iproute2 python-mmap python-flask python-ctypes python-re python-werkzeug python- jinja2 python-itsdangerous gui-init gui-scripts”

IMAGE_INSTALL_append = "gptp misc-utils linuxptp bridge-utils python python-json python-codecs python-io curl lldpad strace lrzsz net-tools tcpdump netcat iperf3 ipic-module iproute2 python-mmap python-flask python-ctypes python-re python-werkzeug python-jinja2 python-itsdangerous gui-init gui-scripts”

  • 使用“bitbake core_image_minimal”构建图像
  • 启动后,运行以下命令:
# lldpad -d
# lldptool 设置-lldp -i eth1 adminStatus=rxtx 
  • 要将其他以太网功能 TLV 添加到 openlldp 框架,请运行:
# lldptool -i eth1 set-tlv -V addEth enableTx=yes 

运行此命令对于抢占是强制性的

  • 要将 MAC/PHY 配置状态 TLV 添加到 openlldp 帧,请运行:
# lldptool -i eth1 set-tlv -V macPhyCfg enableTx=yes
  • 要将 Power via MDI TLV 添加到 openlldp 框架,请运行:
# lldptool -i eth1 set-tlv -V powerMdi enableTx=yes
  • 要将链路聚合 TLV 添加到 openlldp 帧,请运行:
# lldptool -i eth1 set-tlv -V linkAgg enableTx=yes
  • 要将最大帧大小 TLV 添加到 openlldp 帧,请运行:
# lldptool -i eth1 set-tlv -V MTU enableTx=yes
  • 要将系统名称添加到 openlldp 框架,请运行:
# lldptool -T -i eth1 -V sysName enableTx=yes

= 要将端口描述添加到 openlldp 框架,请运行:

# lldptool -T -i eth1 -V portDesc enableTx=yes
  • 要将系统描述添加到 openlldp 框架,请运行:
# lldptool -T -i eth1 -V sysDesc enableTx=yes
  • 要将系统功能添加到 openlldp 框架,请运行:
# lldptool -T -i eth1 -V sysCap enableTx=yes
  • 要将管理地址添加到 openlldp 框架,请运行:
#lldptool -T -i eth1 -V mngAddr -c ipv4=<IP 地址(例如:10.0.0.10)>#lldptool -T -i eth1 -V mngAddr enableTx=yes

例如:
测试步骤:
要在支持抢占的 zcu102 板上激活抢占,请将一块板的 eth1 连接到另一块板的 eth1。在两者上运行 lldpad 守护进程,如下所示:

# lldpad -d# lldptool 设置-lldp -i eth1 adminStatus=rxtx 

通过读取抢占启用寄存器和抢占控制状态寄存器来观察抢占是否启用和激活,如下所示:

#devmem 0x80040440#devmem 0x80040444

可以看出,抢占未启用且处于活动状态,此时附加以太网功能 TLV 被设置为包含在两块板的帧中,如下所示:

#lldptool -i eth1 set-tlv -V addEth enableTx=yes 

可以看出,lldpad 守护程序检测对等方的抢占功能,如果支持抢占,则在其系统中启用抢占,最终激活抢占。

检测结果:
在设置其他以太网功能 TLV 之前:

root@zcu102-zynqmp:~# devmem 0x800404400x00000000root@zcu102-zynqmp:~# devmem 0x800404440x00000900

抢占使能寄存器的第0位为0表示抢占未使能,抢占控制状态寄存器的第31位为0表示抢占未激活。

在两块板上设置额外的以太网功能 TLV 后:

After setting additional Ethernet capabilities TLV in both the boards:

root@zcu102-zynqmp:~# devmem 0x800404400x00000001root@zcu102-zynqmp:~# devmem 0x800404440x820000900

抢占使能寄存器的第0位为1表示抢占使能,抢占控制状态寄存器的第31位为1表示抢占有效。

演示抢占的步骤

1.更改MAC地址(如果背靠背使用两块xilinx板)。
2. 启动 lldpad 守护程序。

# lldpad -d
# lldptool 设置-lldp -i eth1 adminStatus=rxtx

3.设置 lldpad 以获得额外的以太网功能 TLV。确保抢占已启用并处于活动状态。

#lldptool -i eth1 set-tlv -V addEth enableTx=yes 

4.打开网络接口。
5.建立PTP同步,在tx端运行qbv。
6. 根据需要添加交换机 CAM 条目,并从 tx 端发送 ST 和 BE(快速和可抢占)流量。
7. 运行 br_prog < interface name> stats,检查 TX MAC MERGE FRAGMENT COUNT(在 tx 端)、RX MAC MERGE FRAGMENT COUNT(在 rx 端)是否在增加。

Running Spanning Tree Protocol

在 EP+Switch 系统上,使用基于标准 linux 的工具运行 STP 已启用。为了使 HW 使用基于源 MAC 的过滤机制来识别 STP 帧应从哪个端口退出。TSN 驱动程序在驱动程序初始化期间设置这些过滤器。但要实现这一点,环的每个节点都应在编译期间在设备树中设置唯一的 mac 地址。

要在每个节点上运行 STP,请执行以下操作:

#ip link add name br0 type bridge
#ip link set dev eth1 master br0
#ip link set dev eth2 master br0
#ifconfig br0 up
#ip link set dev br0 type bridge stp_state 1

检查生成树的状态

#brctl showstp br0

时间感知 DMA (TADMA)

TimeAware DMA 是一项功能,用户可以通过它控制数据包被拾取进行传输的精确时间。不要与时间感知整形器 (TAS) 混淆。例如,对于循环时间为 1 毫秒的 Qbv 计划,可以将流编程为在特定偏移处触发。如果在该偏移量期间流的流量类别窗口是打开的,则帧将在该偏移量处精确传输。

TADMA 使用 tadma_prog 命令进行编程,在 /etc/stream.cfg 中添加流和每个流的触发点。触发点是相对于 qbv 循环开始时间的,而不是绝对的 PTP 时间。

#tadma_prog -c < interface> < streams config file>

Stream 是 MAC 地址和 VLAN ID 的组合。TADMA 仅适用于 ST – 预定流量数据包。在 QBV 循环时间上提供流的触发点,并在计数值 1 到 4 中提及要发送的 pacect 数。在对 TADMA 编程之前安排 QBV。

默认情况下,TADMA 引擎以连续模式工作,它以连续循环的方式获取 ST 帧。当对流进行编程时,它会进入离散模式,在触发点获取帧。

示例 /etc/stream.cfg:

streams =
({dest = "00:0a:35:00:01:0e";vid = 10;trigger = 100000;count = 1; // fetch 1 frame at this time},{dest = "00:0a:35:00:01:0f";vid = 20;trigger = 200000;count = 2; // fetch 2 frame at this time}
);

OOB 脚本

从2020.1版本的lounge发布开始,开箱即用脚本已包含在其中,用于基本演示任何子句。这些脚本可以在Linux探测之后直接运行,无需任何额外的命令。
OOB 脚本可用于:

  • Qbv+TADMA
  • FRER
  • Qci

如何运行

  • 像往常一样启动 Linux 并在 rootfs 的 /usr sbin/ 文件夹中找到脚本

  • 对于 Qbv 和 tadma

    1. 脚本需要目标 mac 地址作为参数。在链接伙伴上,要查看 mac 地址,请使用以下命令:
      ifconfig < interface >
    2. 为要运行的子句运行脚本
      #sh qbv_auto.sh < dest mac >
    
  • 对于 FRER 和 Qci,接收方脚本应该首先运行。

    1.接收方

    #sh < clause>_receive.sh
    

    2.发送方

    #sh <clause>_sender.sh
    

有关设置的更多详细信息,请参阅入门指南。

常见问题 (FAQ)

Answer:
来自 ptp4l 手册页:
伺服将通过更改时钟频率而不是步进时钟来校正的最大偏移量。当设置为 0.0 时,伺服将永远不会步进时钟,除非在启动时。它以秒为单位指定。默认值为 0.0。

所以时钟只在守护进程启动时调整,而不是在守护进程运行期间调整。您可以通过将 ptp4l_slave.cfg 中的 step_threshold 设置为 1ms 来传递它
/* 将此行添加到从站上的 ptp4l cfg 文件 */
step_threshold 0.001

如果主从之间的差异超过 1 毫秒,这将强制守护进程步进时钟。通常不建议这样做,因为步进时钟会显着改变所有使用 ptp 时间的正在运行的应用程序的时间。

  • 如何在 EP+Switch 设计上运行 PTP 边界时钟

    实例化 EP+Switch 设计时,系统应具有两个网络接口(eth1 和 eth2)和一个内部 cpu 端口/接口(ep)。当使用系统作为终端节点时,PTP 守护进程可以在 eth1 或 eth2 上独立运行。但是,当该系统成为 eth1 和 eth2 都连接到外部系统的 TSN 网络的一部分时,在两个接口(eth1、eth2)上运行 PTP 守护程序(单个实例)很重要。系统中只有一个 PTP 硬件时钟(RTC)。

    使用 ptp4l 运行 BC:
    在 ptp4l 配置文件中启用 clock_type 字段作为 BC。然后按如下方式运行ptp4l。BMCA 应在整个设备上发生。如果 Xilinx 设备成为 GM(通过 BMCA),则通过 eth1 和 eth2 连接的设备应将其时钟(从时钟)与其 PTP 时钟同步。

    #ptp4l -P -2 -H -i eth1 -i eth2 -p /dev/ptp0 -m -f /usr/sbin/ptp4l.confptp4l[139.040]: selected /dev/ptp0 as PTP clock	
    ptp4l[139.076]: driver rejected most general HWTSTAMP filter	
    ptp4l[139.076]: port 1: INITIALIZING to LISTENING on INIT_COMPLETE	
    ptp4l[139.108]: driver rejected most general HWTSTAMP filter	
    ptp4l[139.108]: port 2: INITIALIZING to LISTENING on INIT_COMPLETE	
    ptp4l[139.108]: port 0: INITIALIZING to LISTENING on INIT_COMPLETE	
    ptp4l[142.111]: port 2: new foreign master 000a35.fffe.00012e-1	
    ptp4l[146.111]: selected best master clock 000a35.fffe.00012e	
    ptp4l[146.112]: port 2: LISTENING to UNCALIBRATED on RS_SLAVE	
    ptp4l[146.780]: port 1: LISTENING to MASTER on ANNOUNCE_RECEIPT_TIMEOUT_EXPIRES	
    ptp4l[146.780]: selected best master clock 000a35.fffe.00012e	
    ptp4l[147.362]: port 2: UNCALIBRATED to SLAVE on MASTER_CLOCK_SELECTED	
    ptp4l[147.987]: rms 3090228936610 max 6180457873230 freq -160 +/- 65 delay 394 +/- 0	
    ptp4l[148.987]: rms 39 max 49 freq -240 +/- 8 delay 392 +/- 0	
    ptp4l[149.971]: port 1: new foreign master a0369f.fffe.684c96-1	
    ptp4l[149.987]: rms 18 max 25 freq -239 +/- 7 delay 392 +/- 0	
    ptp4l[150.988]: rms 8 max 13 freq -233 +/- 10 delay 393 +/- 0	
    ptp4l[151.988]: rms 8 max 14 freq -239 +/- 8 delay 393 +/- 0
    
  • TADMA + Qbv doesn’t work - After programming tadma using tadma_prog and qbv using qbv_sched utility, packets belonging to ST don’t come through at specified window.

    Answer:

      a. 确保先运行 PTP。不运行 PTP qbv 状态机将停止。b. 确保您在 EP Qbv 上有一个有效的时间表。c. 确保您的循环时间大于所有触发点。d. 确保您的 ST 流量与 streams.cfg 中编程的流匹配 
    

注意事项:

TADMA 在离散模式下始终使用ep qbv实例进行编程。
它仅取决于循环时间,并且应该大于 tadma 配置 (streams.cfg) 中最后一个流的触发时间。
它应该在周期内有一个有效的 ST 窗口。(至少一包出门)

  • 当前的 TSN 设计使用 PS (Zynq Ultrascale+) 上可用的所有 16 个 PL-PS 中断(IRQ0 和 IRQ1)。我们还有其他一些 PL 模块,它们具有需要连接到 PS 的中断。

    Answer:请参阅 使用 AXI 中断控制器的 TSN 设计

  • 如何在 SD 卡上创建 rootfs
    注意: 2020.x 及更高版本中不使用 unenv.txt。有关详细信息,请参阅 TSN SW 用户指南。请参阅上面的 PCP 部分,了解如何在没有 uenv 文件的情况下指定 PCP 值。

  1. 从 tmp/ 中获取 fitImage-< board name >.bin、BOOT-< board name>.bin、uEnv.txt(仅限 2019.x 版本)、boot.scr 和 core-image-minimal- < board name >.cpio deploy/images/< board name>/ . 将 BOOT-< board name>.bin 重命名为 BOOT.bin。
  2. 将 uEnv.txt 中的“fit_image=fitImage-core-image-minimal-< board name>-< board name>”替换为“fit_image=fitImage-.bin”(仅限 2019.x 版本)
  3. 使用 GParted 分区编辑器或 fdisk 命令行参数,将 SD 卡分成两部分。第一部分必须有 FAT32 文件系统,它的大小应该比 fitImage-< board name>.bin、BOOT.bin、uEnv.txt(仅限 2019.x 版本)和 boot.scr 的总和大一点。
  4. 第二部分将包含 SD 卡的剩余部分,并且它必须具有 EXT3 文件系统。
  5. 复制fitImage-< boardname >.bin, BOOT.bin, uEnv.txt(只到2019.x版本)和boot.scr到第一个分区(FAT32文件系统)
  6. 转到第二个分区的挂载区域并运行“cpio -iv < <location of core-image-minimal-< board name>.cpio>”(例如:“cpio -iv < /media/core-image-minimal- <开发板名称>.cpio”)
  7. 使用 SD 卡启动电路板。当您更改任何文件(例如 /etc/qbv.cfg)时,更改将在重新启动时保留。

使用 AXI 中断控制器的 TSN 设计

AXI中断控制器可以在Zynq和ZynqMP平台上以级联方式连接即PL-interruptpin—>AXI-INTC-→GIC。在这种情况下,使用 AXI-INTC 作为中断控制器的外设会将它们的处理程序注册到 AXI-INTC,并且它们可以向 AXI-INTC 生成中断。AXI-INTC 将注册为 GIC 的外设。每当外设对 AXI-INTC 产生中断时,它就会对 GIC 产生中断。

用法

当系统需要超过 16 条中断线连接到 Zynq/ZynqMP 时,AXI 中断控制器将非常有用。

下图显示了中断如何串联并连接到级联到 ZynqMP pl_ps_irq0 的 axi_intc。
在这里插入图片描述

										image : 将外设中断线连接到 axi_intc

设备树生成问题

为了正确生成设备树,需要在 axi_intc IP 中进行以下设置。
在这里插入图片描述

										  image : 为正确的 dtg 更改 irq 输出连接

此设置启用 irq pin 并确保在 axi_intc 节点内正确生成中断父代和中断号。

axi_intc_0: interrupt-controller@80001000 {#interrupt-cells = <2>;clock-names = "s_axi_aclk";clocks = <&misc_clk_1>;compatible = "xlnx,axi-intc-4.1", "xlnx,xps-intc-1.00.a";interrupt-controller ;interrupt-names = "irq";interrupt-parent = <&gic>;interrupts = <0 89 4>;reg = <0x0 0x80001000 0x0 0x1000>;xlnx,kind-of-intr = <0x8000>;xlnx,num-intr-inputs = <0x10>;};

主线状态

目前TSN驱动程序尚未上游化。

已知问题和故障排除

→ 当 TSN 板以环路配置连接时,可以观察到对广播数据包的重复 ping。这可以通过 2 个背靠背板或更多板观察到,其中网络中可能存在环路。一个标准的解决方案是启用 STP(见下文)。这并非特定于 TSN 系统,它是任何可能存在环路的网络的常见预防措施。

ip link add name br0 type bridge
ip link set dev eth1 master br0
ip link set dev eth2 master br0
ifconfig br0 up
ip link set dev br0 type bridge stp_state 1

→ 在繁忙的流量下,PTP 可能会与超时错误不同步,表明 PTP 进程和底层时间戳获取没有收到足够的时间/优先级来运行。调整这取决于系统中的流量,但典型的建议如下:

  • 在 PTP 配置文件中将 tx_timestamp_timeout 增加到 10。如果使用板对板设置,这可以在主配置和从配置上更新,以解决增加的 TX 和 RX 流量。
  • 如果使用 tsn_talker 发送流量,则在数据包大小为 1472 的情况下,可以使用不超过 3 个 tsn talker 实例来实现全吞吐量。

→ TSN 2022.1 内核驱动程序不支持动态设备树覆盖。
→ TSN PCP 值是强制性的,如果未按照“PCP 和流量类别”部分所述进行选择,则 PCP 没有默认值。

变更日志

2023.1

  • Fox 是 6.1.0 Linux 内核
    2022.2

  • Bug修复。

  • 删除了 tsn 接口的硬编码接口名称。

  • 将默认 PCP 设置为队列映射,以防其未通过 bootargs 定义。

2022.1

  • TSN 内核驱动程序支持已添加到暂存区

https://github.com/Xilinx/linux-xlnx/tree/xilinx-v2022.1/drivers/staging/xilinx-tsn

这篇关于赛灵思 TSN 解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/212860

相关文章

js异步提交form表单的解决方案

1.定义异步提交表单的方法 (通用方法) /*** 异步提交form表单* @param options {form:form表单元素,success:执行成功后处理函数}* <span style="color:#ff0000;"><strong>@注意 后台接收参数要解码否则中文会导致乱码 如:URLDecoder.decode(param,"UTF-8")</strong></span>

明明的随机数处理问题分析与解决方案

明明的随机数处理问题分析与解决方案 引言问题描述解决方案数据结构设计具体步骤伪代码C语言实现详细解释读取输入去重操作排序操作输出结果复杂度分析 引言 明明生成了N个1到500之间的随机整数,我们需要对这些整数进行处理,删去重复的数字,然后进行排序并输出结果。本文将详细讲解如何通过算法、数据结构以及C语言来解决这个问题。我们将会使用数组和哈希表来实现去重操作,再利用排序算法对结果

UE5 半透明阴影 快速解决方案

Step 1: 打开该选项 Step 2: 将半透明材质给到模型后,设置光照的Shadow Resolution Scale,越大,阴影的效果越好

MySQL主从同步延迟原理及解决方案

概述 MySQL的主从同步是一个很成熟的架构,优点为: ①在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力; ②在从主服务器进行备份,避免备份期间影响主服务器服务; ③当主服务器出现问题时,可以切换到从服务器。 相信大家对于这些好处已经非常了解了,在项目的部署中也采用这种方案。但是MySQL的主从同步一直有从库延迟的问题,那么为什么会有这种问题。这种问题如何解决呢? MyS

安装SQL2005后SQL Server Management Studio 没有出来的解决方案

一种情况,在安装 sqlServer2005 时 居然出现两个警告: 1 Com+ 目录要求 2 Edition change check 郁闷!网上说出现两个警告,是肯定装不成功的!我抱着侥幸的态度试了下,成功了。 安装成功后,正准备 “ 仅工具、联机丛书和示例(T)” 但是安装不了,他提示我“工作站组件”安装过了对现有组件无法更新或升级。 解决办法: 1 打开“控

AI和新基建赋能智慧工地超融合管理平台解决方案

1. 项目背景与需求 电力行业的工程管理正朝着智慧化发展,但目前仍处于起步阶段。为满足数字化、网络化、智能化的发展需求,需要构建一个高效综合监控平台,实现对电力项目全过程的精益化管控。 2. 综合管理平台的构建 该平台集成了超融合实景监控、安全智能监测、公共安全防范、技术管理、人员管控和绿色施工等多个方面,通过BIM协同优化设计,提升项目质量和进度管理。 3. 安全智能监测的重要性 安全

【解决方案】软件大屏实现整体技术解决方案

1.系统概述 1.1.需求分析 1.2.重难点分析 1.3.重难点解决措施 2.系统架构设计 2.1.系统架构图 2.2.关键技术 2.3.接口及要求 3.系统功能设计 3.1.功能清单列表 3.2.数据源管理 3.3.数据集管理 3.4.视图管理 3.5.仪表盘管理 3.6.移动端设计 3.1.系统权限设计 3.2.数据查询过程设计 软件全套资料部分文档清单: 工作安排任务书,可行性分

基于Hypervisor智能驾舱的AUTOSAR解决方案

MENTOR嵌入式管理程序 目前,通常使用两种类型的管理程序(图6): Type 1本机管理程序:一种在硬件上本机运行的管理程序,因为它充当核心中的操作系统。Type 2托管虚拟机监控程序:此类型的虚拟机监控程序必须由另一个操作系统托管,并且仅负责使用主机操作系统可用的资源来虚拟化客户操作系统。 图6:虚拟机管理程序 虚拟化的工作原理是从硬件上运行的应用程序中抽象出物理硬件和设备。虚拟化流程管理

关于iReport5.6.0无法正常启动或者闪退或者JDK8不兼容的解决方案

我下载了iReport5.6.0 版本的,启动不起来;jdk 1.8 下载iReport5.6.0地址:https://download.csdn.net/download/u013456370/10589765 参考链接:https://blog.csdn.net/erlian1992/article/details/76359191?locationNum=6&fps=1 如果是停留在这

聊聊分布式,再讨论分布式解决方案

前言 最近很久没有写博客了,一方面是因为公司事情最近比较忙,另外一方面是因为在进行 CAP 的下一阶段的开发工作,不过目前已经告一段落了。 接下来还是开始我们今天的话题,说说分布式事务,或者说是我眼中的分布式事务,因为每个人可能对其的理解都不一样。 分布式事务是企业集成中的一个技术难点,也是每一个分布式系统架构中都会涉及到的一个东西,特别是在微服务架构中,几乎可以说是无法避免,本文就分布式事