当前位置: 首页 > news >正文

PCIe - ZCU106(RC) + KU5P(EP) + 固化

目录

1. 简介

1.1 Data Mover

1.2 描述符

2. ZCU102

2.1 Ubuntu OS

2.2 USB Host

2.2.1 连接拓扑

2.2.2 设备类型

2.2.3 USB 跳帽设置

2.3 无线网卡

2.4 PCIe Info

2.4.1 Diagram

2.4.2 lspci -tv

2.4.3 lspci -v

2.4.2.1 设备基本信息

2.4.2.2 控制与状态寄存器

2.4.2.3 中断与总线拓扑

2.4.2.4 地址空间配置

2.4.2.5 桥接器控制与能力

2.4.2.6 内核驱动

2.4.4 setpci

2.4.5 命令汇总

3. ZCU102+KU5P

3.1 vivado 工程

3.1.1 Block Design

3.1.2 IBUFDS_GTE

3.1.3 XDMA PCIe

3.1.4 Address Editor

3.1.5 烧写与固化

3.2 寄存器空间

3.2.1 寄存器地址格式

3.2.2 H2C 通道寄存器空间

3.2.3 C2H 通道寄存器空间

3.2.4 其他寄存器空间

3.2.5 举例

4. Driver

4.1 PCIe 一些概念

4.1.1 BAR

4.1.2 中断与轮询

4.2 DMA drivers

4.2.1 PCIe Device IDs

4.2.2 编译并加载驱动

4.2.3 查看驱动信息

4.2.4 获取通道标识符

4.2.5 xdma0_user 测试

4.2.6 xdma0_bypass 测试

4.2.7 xdma0_h2c_0 读写测试

4.3 调试方法

4.3.1 xdma cdev init

4.3.2 h2c status

4.3.3 xfer timed out

4.3.4 Debug Options

4.3.5 信号完整性问题

5. 总结


1. 简介

1.1 Data Mover

DMA/Bridge Subsystem for PCIe 就是一个数据搬运器件,用于在主机内存和 DMA 子系统之间搬运数据。子系统通过处理一种叫做 “描述符” 的数据结构来完成在主机内存和 DMA 子系统之间移动数据的任务。

|------|            |------------------------------FPGA-----------------------------|
|      |            |    |---------------|                  |-------------------|   |
|      |            |    |               |                  |                   |   |
| Host |    PCIe    |    |   DMA/Bridge  | M_AXI      S_AXI |   User Logic      |   |
| App  |<---------->|<-->|   for PCIe    |<---------------->|   e.g.            |   |
|      |    slot    |    |               |                  |   HW Accelerator  |   |
|      |            |    |  (AXI-master) |                  |   (AXI-slave)     |   |
|      |            |    |---------------|                  |-------------------|   |
|------|            |---------------------------------------------------------------|

连接不同的 AXI-slave,可以实现不同的功能:

  • 连接 AXI BRAM 或 AXI DDR MC,则整个 FPGA 可以看作一个 PCIe 内存设备,Host-PC 可以读写该内存;
  • 一个硬件加速器,则 Host-PC 可以通过 PCIe 调用该加速器;
  • AXI 桥,下游挂多个 AXI slave ,可以同时实现更多功能。

1.2 描述符

你可以把 “描述符” 想象成一个包含了数据传输指令的小包裹。这个包裹里面明确地写着:

  • 源 (Source): 数据从哪里来(例如,主机内存中的某个具体地址)。
  • 目标 (Destination): 数据要到哪里去(例如,DMA 子系统中的某个地址,或者反过来)。
  • 要传输数据量 (Amount of data to transfer): 需要移动多少数据(例如,多少个字节)。

DMA 子系统会读取并执行这些 “描述符” 中的信息,从而自动地将数据从源地址搬运到目标地址,而不需要 CPU 的直接干预。

简单来说,DMA 子系统依靠这些 “描述符” 来了解它需要做什么样的数据搬运工作。

2. ZCU102

2.1 Ubuntu OS

Install Ubuntu on AMD | Ubuntu Use Ubuntu on AMD for the familiar developer experience and an accelerated path to production.https://ubuntu.com/download/amd

2.2 USB Host

2.2.1 连接拓扑

PHY IC: USB3320 @U116

2.2.2 设备类型

 USB 设备类型

  • A 类设备:指的是标准的 USB Host 设备,如计算机或笔记本电脑,它们提供电源并管理连接的 USB 设备。
  • B 类设备:通常是外围设备,如打印机、鼠标或键盘,它们从 A 类设备接收电源和数据。 

2.2.3 USB 跳帽设置

跳帽设置:

2.3 无线网卡

下载地址:

W311MI _Tenda-All For Better NetWorkingW311MIhttps://www.tendacn.com/product/overview/W311MIv6.html

W311MIv6.0 Driver (Ubuntu/UOS/Kylin OS) 可以给 KV260、ZCU102 的 Ubuntu 系统使用。

2.4 PCIe Info

2.4.1 Diagram

1)Diagram

Form factor for PCIe Gen2x4 Host, Micro-ATX chassis footprint

2.4.2 lspci -tv

显示了系统的PCIe拓扑结构

>> lspci -tv
---
-[0000:00]---00.0-[01-0c]----00.0  Xilinx Corporation Device 9021

1)[0000:00]:是 PCIe 层级结构的根节点(Root Complex)

  • 0000 是 PCI 域号(domain number),通常为 0000
  • 00 是总线号(bus number),00 表示这是根总线

2)---00.0:是根端口(Root Port)的设备号和功能号

  • 00 是设备号(device number)
  • .0 是功能号(unction number)

3)-[01-0c]:表示这个根端口连接的下游设备所在的总线范围

  • 01-0c 表示总线号从 01 到 0c (十进制12)
  • 这意味着这个根端口下可以有多达 12 个不同的总线

4)00.0 Xilinx Corporation Device 9021

  • 00.0 是子 PCI 设备的设备和功能编号
  • Xilinx Corporation Device 9021 是设备的供应商和型号
>> lspci -vt
-[0000:00]-+-00.0  Intel Corporation Device 9b53+-01.0-[01]----00.0  Xilinx Corporation Device 9021+-02.0  Intel Corporation Device 9bc8+-04.0  Intel Corporation Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Thermal Subsystem+-12.0  Intel Corporation Comet Lake PCH Thermal Controller+-14.0  Intel Corporation Comet Lake USB 3.1 xHCI Host Controller+-14.2  Intel Corporation Comet Lake PCH Shared SRAM+-16.0  Intel Corporation Comet Lake HECI Controller+-16.3  Intel Corporation Device 06e3+-17.0  Intel Corporation Device 06d2+-1b.0-[02]----00.0  SK hynix Device 1339+-1f.0  Intel Corporation Device 0687+-1f.3  Intel Corporation Comet Lake PCH cAVS+-1f.4  Intel Corporation Comet Lake PCH SMBus Controller+-1f.5  Intel Corporation Comet Lake PCH SPI Controller\-1f.6  Intel Corporation Ethernet Connection (11) I219-LM

这两行:

+-01.0-[01]----00.0 Xilinx Corporation Device 9021
+-1b.0-[02]----00.0 SK hynix Device 1339

这两行之所以看起来和别的不一样,它们表示的是 PCI 桥(PCI Bridge) 以及连接在该桥后面的设备。

  • 普通行 (例如 +-02.0 Intel Corporation Device 9bc8): 显示的是直接连接在当前总线(这里是总线 00)上的终端设备(Endpoint Device),比如集成显卡、USB 控制器、网卡等。它们不连接其它总线。
  • 特殊行 (例如 +-01.0-[01]----00.0 Xilinx ...): 显示的是一个 PCI 桥 (01.0) 以及通过这个桥连接到下一级(次级)总线 ([01]) 上的第一个设备 (00.0)。这种表示方法突出了设备间的层级和连接关系,显示了哪些设备是挂载在桥下面的。

2.4.3 lspci -v

lspci 提供了系统中 PCIe 桥接设备(Xilinx Corporation 制造)的详细信息:

ubuntu@zynqmp:~$ lspci -vv
---
00:00.0 PCI bridge: Xilinx Corporation Device d021 (prog-if 00 [Normal decode])Control: I/O- Mem- BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-Latency: 0Interrupt: pin A routed to IRQ 62Bus: primary=00, secondary=01, subordinate=0c, sec-latency=0I/O behind bridge: 00000000-00000fff [size=4K]Memory behind bridge: [disabled]Prefetchable memory behind bridge: [disabled]Secondary status: 66MHz- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- <SERR- <PERR-BridgeCtl: Parity- SERR+ NoISA- VGA- VGA16- MAbort- >Reset- FastB2B-PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREn-Capabilities: <access denied>Kernel driver in use: pcieport

2.4.2.1 设备基本信息

1)设备位置与类型

  • 00:00.0 表示设备在 PCI 总线上的位置(总线 00,设备 00,功能 0)。
  • 这是一个 PCI 桥接器(PCI bridge),型号为 Xilinx Corporation Device d021,用于连接主总线(00)和次级总线(01-0c)。

2)编程接口(prog-if)

  • Normal decode 表示桥接器以标准方式解码 PCI 地址。

2.4.2.2 控制与状态寄存器
  • 功能禁用(带-),功能启用(带+)

1)Control 寄存器

  • BusMaster+:桥接器可以发起总线请求(DMA 操作)。
  • I/O- Mem-:桥接器未启用 I/O 和内存空间访问(可能未配置或未激活)。
  • 其他标志(如 SERR-、FastB2B-)表示错误报告和快速传输功能未启用。

2)Status 寄存器

  • Cap+:设备支持 Capability List(扩展功能列表)。
  • DEVSEL=fast:设备快速响应访问请求。
  • 无错误状态(ParErr-、SERR- 等)。

2.4.2.3 中断与总线拓扑

1)中断路由:

  • Interrupt: pin A routed to IRQ 62
  • 桥接器的中断引脚 A 连接到系统的 IRQ 62。

2)总线范围:

  • primary=00:主总线编号 00(连接 CPU)。
  • secondary=01:次级总线起始编号 01。
  • subordinate=0c:次级总线结束编号 0c(表示该桥接器下可管理总线 01-0c)。
  • sec-latency=0:次级总线访问延迟为 0。

2.4.2.4 地址空间配置

1)I/O 空间:

  • 00000000-00000fff [size=4K]
  • 桥接器后挂载的设备的 I/O 空间范围为 4KB,但当前未启用(I/O behind bridge 未分配实际地址)。

2)内存空间:

  • Memory behind bridge: [disabled]
  • 内存和预取内存空间均未启用(可能需动态配置或未使用)。

2.4.2.5 桥接器控制与能力

1)Secondary Status

  • 次级总线的状态(类似主状态寄存器),无错误或特殊配置。

2)BridgeCtl

  • 控制桥接器行为的标志,例如:
    • SERR+:启用系统错误报告。
    • NoISA-:允许 ISA 风格的访问(已过时)。
    • VGA-:不支持 VGA 兼容模式。

3)Capabilities:

  • <access denied> 表示需要 root 权限才能查看扩展功能(如 PCIe 链路速度、电源管理等)。

2.4.2.6 内核驱动
  • Kernel driver in use: pcieport

当前由 Linux 内核的 pcieport 驱动管理,该驱动负责处理 PCIe 端口和桥接器的通用功能(如热插拔、错误处理等)。

2.4.4 setpci

1)COMMAND 寄存器

在 PCIe 设备中,COMMAND 寄存器是一个 16位寄存器,控制设备的基本操作权限,其低 8 位的标志位控制设备的核心功能:

Bit 	Name            Function
--------------------------------------------------------------------------------
0       I/O Space       启用设备对 I/O 端口 的访问(如 in/out 指令)
1       Memory Space    启用设备对 内存映射寄存器(MMIO) 的访问(如 BAR0/BAR1)
2       Bus Mastering   允许设备发起 DMA 操作(直接读写主机内存)
3-15	Others          如中断禁用、快速背靠背传输等(通常次要)

2)查看 Control 状态

>> sudo lspci -vv -s 01:00.0 | grep Control
---
Control: I/O- Mem- BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-

说明当前设备 所有关键功能均未启用,无法访问它的内存或寄存器。

3)启用功能

>> sudo setpci -s 01:00.0 COMMAND=0x07

0x07 的二进制是 00000111,它同时启用:

  • Bit 0 (I/O Space) = 1 → 允许 I/O 访问
  • Bit 1 (Memory Space) = 1 → 允许 MMIO 访问
  • Bit 2 (Bus Mastering) = 1 → 允许 DMA

为什么内核没有自动启用?

  • 无专用驱动加载:内核检测到设备但未绑定驱动时,可能不会主动启用其功能。
  • 安全策略限制:部分系统默认禁用未认证设备的 Bus Mastering(防 DMA 攻击)。

4)查看驱动加载情况

>> sudo dmesg | grep 9021
---
[    3.807355] pci 0000:01:00.0: [10ee:9021] type 00 class 0x058000

从 dmesg 输出和之前的 lspci 信息来看,并没有为这个 Xilinx 设备(9021)加载专用驱动。

2.4.5 命令汇总

用途命令
快速查看设备lspci
查看详细信息lspci -vv
查看拓扑结构lspci -tv
查找 Xilinx 设备lspci -d 10ee
检查 PCIe 链路lspci -vv | grep -i "width|speed"
查看内存映射lspci -v | grep -i memory
检查驱动绑定lspci -k
>> lspci
---
00:00.0 PCI bridge: Xilinx Corporation Device d021

命名规则

<bus>:<device>.<function>

  • 1. <bus> - 01,总线号(Bus Number) 。这里是 00,表示该设备连接到总线 0。
  • 2. <device> - 00,设备号(Device Number) 。这里是 00,表示这是总线 0 上的第 1 个设备(设备号从 0 开始)。
  • 3. <function> - 0,功能号(Function Number) 。这里是 0,表示这是该设备的第 1 个功能(功能号从 0 开始)。

3. ZCU102+KU5P

3.1 vivado 工程

3.1.1 Block Design

1)PCIe BRAM

 XDC:

set_property IOSTANDARD LVCMOS33 [get_ports led_0]
set_property PACKAGE_PIN J12     [get_ports led_0]set_property PACKAGE_PIN H14     [get_ports {led_1_tri_io[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led_1_tri_io[0]}]set_property PACKAGE_PIN H12     [get_ports user_lnk_up_0]
set_property IOSTANDARD LVCMOS33 [get_ports user_lnk_up_0]set_property PACKAGE_PIN V7 [get_ports {pcie_cref_clk_p[0]}]set_property PACKAGE_PIN T19     [get_ports pcie_rst_n]
set_property IOSTANDARD LVCMOS18 [get_ports pcie_rst_n]set_property PACKAGE_PIN K22        [get_ports {sysclk_clk_p[0]}]
set_property IOSTANDARD DIFF_SSTL12 [get_ports {sysclk_clk_p[0]}]set_property PACKAGE_PIN J14     [get_ports ext_rst_n]
set_property IOSTANDARD LVCMOS33 [get_ports ext_rst_n]create_clock -period 10.000 -name {pcie_cref_clk_p[0]} -waveform {0.000 5.000} [get_ports {pcie_cref_clk_p[0]}]set_property BITSTREAM.GENERAL.COMPRESS TRUE  [current_design]
set_property BITSTREAM.CONFIG.CONFIGRATE 51.0 [current_design]
set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4  [current_design]
set_property CONFIG_MODE SPIx4 [current_design]
set_property C_CLK_INPUT_FREQ_HZ 300000000 [get_debug_cores dbg_hub]
set_property C_ENABLE_CLK_DIVIDER false    [get_debug_cores dbg_hub]
set_property C_USER_SCAN_CHAIN 1           [get_debug_cores dbg_hub]
connect_debug_port dbg_hub/clk [get_nets clk]

2)PCIe DDR

 XDC 参见:

《 Vivado - JTAG to AXI Master (DDR4初始化读写测试)-CSDN博客 》

3.1.2 IBUFDS_GTE

Primitive: Gigabit Transceiver Buffer

对于高速 GT,需要使用 IBUFDS_GTE,如果使用 IBUFDS,在编译或者生成 bit 时会报错,提示该时钟约束有问题。

3.1.3 XDMA PCIe

IP: DMA/Bride Subsystem for PCI Express v4.1

1)Basic Tab

2)PCIe ID Tab

Device ID(9021)含义:

  • 9 - Ultrascale+ 系列
  • 2 - PCIe 2.0(5Gbps)
  • 1 - 通信链路 Lane = 1

3)PCIe:BARs Tab

4)PCIe:MISC Tab

5)PCIe:DMA Tab

3.1.4 Address Editor

3.1.5 烧写与固化

1)生成 bin 文件的相关配置

2) 配置 BITSTREAM 属性

直接添加 XDC 约束:

set_property BITSTREAM.GENERAL.COMPRESS     TRUE  [current_design]
set_property BITSTREAM.CONFIG.CONFIGRATE    51.0  [current_design]
set_property BITSTREAM.CONFIG.SPI_BUSWIDTH  4     [current_design]

或者通过 GUI 配置:

打开综合后或实现后的设计,Tools -> Edit Device Properties:

3)添加 Flash 设备

4)执行烧写

3.2 寄存器空间

3.2.1 寄存器地址格式

DMA/Bridge Subsystem for PCIe 寄存器可从主机或 AXI 从接口进行访问。这些寄存器应用于 DMA 编程和状态检查。

3.2.2 H2C 通道寄存器空间

 

3.2.3 C2H 通道寄存器空间

3.2.4 其他寄存器空间

3.2.5 举例

1)地址 0x0000_0040

表示 H2C 类别中,第一个通道,H2C Channel Status (0x40) 寄存器

2)地址 0x0000_1040

表示 C2H 类别中,第一个通道,H2C Channel Status (0x40) 寄存器

3)地址 0x0000_1100

表示 C2H 类别中,第二个通道,H2C Channel Identifier (0x00) 寄存器

4)0x0000_3000

表示配置块寄存器 (0x3)中,Config Block Identifier (0x00) 寄存器

4. Driver

4.1 PCIe 一些概念

4.1.1 BAR

1)BAR的基本含义

BAR(Base Address Register)

BAR 是 PCIe 设备用来定义其内存空间或 I/O 空间在系统地址空间中的基地址(Base Address)的寄存器。每个 BAR 会映射到一个物理地址范围,系统通过这个范围访问设备的资源(如内存、寄存器等)。

BAR 的大小和类型(内存空间或I/O空间)由 BAR 的配置决定。
在 PCIe 设备中,通常有多个 BAR(例如,6个BAR),每个 BAR 可以独立配置。

2)BAR的作用

BAR 的用途是为 PCIe 设备提供一种与主机(Host)通信的机制:

内存空间映射:通过 BAR,操作系统或驱动程序可以访问 FPGA 内部的内存或寄存器。
地址分配:在系统启动时,BIOS 或操作系统会为每个 BAR 分配一个唯一的物理地址。
设备功能支持:不同的 BAR 可以用于不同的功能,例如数据传输、控制寄存器访问等。

4.1.2 中断与轮询

1)切换为轮询

默认情况下,驱动程序使用中断来通知 DMA 传输完成。如何修改驱动程序以使用轮询而不是中断来确定 DMA 事务何时完成?

答:在插入内核模块时,可以将驱动程序从中断驱动(默认)更改为轮询驱动(轮询模式)。

sudo ./load_driver.sh 4
---
interrupt_selection 4.
xdma                   98304  0
Loading driver...insmod xdma.ko poll_mode=1 ...The Kernel module installed correctly and the xmda devices were recognized.
DONE

注意:中断模式与轮询模式将应用于所有 DMA 通道。如果需要,可以修改驱动程序,使某些通道为中断驱动,而其他通道为轮询驱动。有关在轮询模式下使用 PCIe DMA IP 的更多信息,请参阅 PG195 中的轮询模式部分。

2)中断

中断需要周密的思考和规划,因为它们在设备驱动程序中扮演着关键角色。中断处理可能具有挑战性,因为它们需要大量测试来验证没有问题;而当问题出现时(例如中断丢失),调试起来可能非常困难。包含大量调试代码的 Linux 驱动程序可能会改变其行为,以至于操作完全失效,或者运行极其缓慢,从而严重改变系统状态。

有些中断是电平触发(level triggered),有些中断是边沿触发(edge triggered)。这些中断会被转换为 PCIe 中断。PCIe IP 的中断输入因具体 IP 而异,但通常是一个请求(request)随后跟一个许可(grant),表示该 IP 已接受请求。可能需要进行一些从 IP 中断到 PCIe 中断的转换。AXI IIC IP 核是电平触发中断,而 AXI QSPI IP 核是边沿触发中断。对于电平触发中断,应在驱动程序中仔细检查,以确保根据从 IP 域到 PCIe 域的转换方式,中断不会丢失。

在文档中查找 IP 的中断触发类型可能很有挑战性,但可以在 Vivado 中查看,如下所示。选中中断引脚(interrupt pin),然后查看其配置,即可看到信号的敏感度(sensitivity)(边沿或电平)。

3)整体思路

在主机 CPU 上运行的 DMA 驱动程序的目的是准备外设的 DMA 传输,因为只有操作系统(OS)才完全控制着内存系统、文件系统以及用户空间进程。首先,需要对外设的 DMA 引擎进行编程,设置要复制的内存范围的源地址和目标地址。其次,通知设备开始 DMA 传输。当传输完成时,设备通常会产生中断,以通知 CPU 传输已结束。对于每个中断,一个由驱动程序预先安装的中断处理程序会被调用,然后操作系统可以相应地确认已完成的传输。

4.2 DMA drivers

4.2.1 PCIe Device IDs

如何修改内核模块驱动识别的 PCIe 设备 ID?

参见 "dma_ip_drivers-master\XDMA\linux-kernel\readme.txt"

xdma/xdma_mod.c 文件中包含 pci_device_id 结构体,用于识别驱动支持的 PCIe 设备 ID,格式如下:

//        Vendor ID, Device ID
{ PCI_DEVICE(0x10ee, 0x9021), },

根据需要添加、删除或修改此结构体中的 PCIe Device ID。然后卸载现有的 xdma 内核模块,重新编译驱动,并使用 load_driver.sh 脚本重新安装驱动。 

4.2.2 编译并加载驱动

1)编译 KO 模块

>> cd <dma_ip_drivers-master>/XDMA/linux-kernel/xdma/
>> sudo make install

在 xdma 路径下创建了两个文件:xdma.mod.o、xdma.ko

-rw-rw-r-- 1 dd dd 4769480 April   4 17:22 xdma.ko
-rw-rw-r-- 1 dd dd 126880  April   4 17:22 xdma.mod.o

2)编译测试工具(tools)

>> cd <dma_ip_drivers-master>/XDMA/linux-kernel/tools
>> make

会出现一些 warning,可以忽略。 

3)加载内核模块驱动程序,有两种方法:

  • 通过 shell 命令直接加载
modprobe xdma

通过 script

>> sudo ./load_driver.sh
---
interrupt_selection .
xdma                   98304  0
Loading driver...insmod xdma.ko interrupt_mode=2 ...The Kernel module installed correctly and the xmda devices were recognized.
DONE

4.2.3 查看驱动信息

1)加载驱动后

>> sudo lspci -vv -s 01:00.0 | grep Kernel
---
Kernel driver in use: xdma
Kernel modules: xdma

2)对应的设备节点

>> ll /dev/xdma*
---
/dev/xdma0_control
/dev/xdma0_h2c_0
/dev/xdma0_c2h_0
/dev/xdma0_bypass
/dev/xdma0_bypass_h2c_0
/dev/xdma0_bypass_c2h_0
/dev/xdma0_user
/dev/xdma0_xvc/dev/xdma0_events_0
/dev/xdma0_events_1
...
/dev/xdma0_events_15

3)查看驱动程序详情

PS:无需指定路径

>> modinfo xdma
---
filename:       /lib/modules/5.15.0-126-generic/xdma/xdma.ko
license:        Dual BSD/GPL
version:        2020.2.2
description:    Xilinx XDMA Reference Driver
author:         Xilinx, Inc.
srcversion:     2EEB4A2EC40A3FC02ABA554
alias:          pci:v00001D0Fd0000F001sv*sd*bc*sc*i*
alias:          pci:v00001D0Fd0000F000sv*sd*bc*sc*i*
alias:          pci:v000010EEd00002808sv*sd*bc*sc*i*
...
...
depends:
retpoline:      Y
name:           xdma
vermagic:       5.15.0-126-generic SMP mod_unload modversions
parm:           h2c_timeout:H2C sgdma timeout in seconds, default is 10 sec. (uint)
parm:           c2h_timeout:C2H sgdma timeout in seconds, default is 10 sec. (uint)
parm:           poll_mode:Set 1 for hw polling, default is 0 (interrupts) (uint)
parm:           interrupt_mode:0 - Auto , 1 - MSI, 2 - Legacy, 3 - MSI-x (uint)
parm:           enable_st_c2h_credit:Set 1 to enable ST C2H engine credit feature, default is 0 ( credit control disabled) (uint)
parm:           desc_blen_max:per descriptor max. buffer length, default is (1 << 28) - 1 (uint)

4.2.4 获取通道标识符

通过 Channel Identifier(通道标识符),可以得到通道属性:

  • Channel exist
  • Channel Target(H2C / C2H)
  • Stream / Mem map
  • Channel ID
  • Version

1)发送通道查询指令

>> sudo ./reg_rw /dev/xdma0_control 0x0000

设备节点 /dev/xdma0_control 的寄存器描述《pg195-pcie-dma-en-us-4.1》:

|-----------|----------------|------------------------------------------------------------|
| Bit Index | Field          | Description                                                |
|-----------|----------------|------------------------------------------------------------|
| 15:12     | Target         | The destination submodule within the DMA                   |
|           |                | 4'h0: H2C Channels                                         |
|           |                | 4'h1: C2H Channels                                         |
|           |                | 4'h2: IRQ Block                                            |
|           |                | 4'h3: Config                                               |
|           |                | 4'h4: H2C SGDMA                                            |
|           |                | 4'h5: C2H SGDMA                                            |
|           |                | 4'h6: SGDMA Common                                         |
|           |                | 4'h8: MSI-X                                                |
|-----------|----------------|------------------------------------------------------------|
| 11:8      | Channel ID[3:0]| This field is only applicable for H2C Channel, C2H Channel,|
|           |                | H2C SGDMA, and C2H SGDMA Targets. This field indicates     |
|           |                | which engine is being addressed for these Targets.         |
|           |                | For all other Targets this field must be 0.                |
|-----------|----------------|------------------------------------------------------------|
| 7:0       | Byte Offset    | The byte address of the register to be accessed within the |
|           |                | target. Bits[1:0] must be0.                                |
|-----------|----------------|------------------------------------------------------------|

例一,向 /dev/xdma0_control 写入 0x0000 时,表示查询 H2C 的第一个通道 identifier 信息:

  • Target[15:12]: 0x0 - H2C Channels
  • Channel[11:8]:  0x0 - No 1.
  • ByteOffset[7:0]: 0x00 - Channel Identifier (0x00)

例二,向 /dev/xdma0_control 写入 0x1003 时,表示查询 C2H 第四个通道 identifier 信息:

  • Target[15:12]: 0x0 - C2H Channels
  • Channel[11:8]:  0x0 - No 4.
  • ByteOffset[7:0]: 0x00 - Channel Identifier (0x00)

例三,向 /dev/xdma0_control 写入 0x0040 时,表示查询 H2C 的第一个通道 identifier 信息:

  • Target[15:12]: 0x0 - H2C Channels
  • Channel[11:8]:  0x0 - No 1.
  • ByteOffset[7:0]: 0x40 - Channel Status (0x40)

2)回读信息解释

>> sudo ./reg_rw /dev/xdma0_control 0x0000
---
device: /dev/xdma0_control, address: 0x0 (0x0+0x0), access read.
access width: word (32-bits)
character device /dev/xdma0_control opened.
Memory 0x0 mapped at address 0x7f924a39c000.
Read 32-bit value at address 0x0 (0x7f924a39c000): 0x1fc00006

返回值 0x1fc10006 表示:

  • [31:20]: 12’h1fc - DMA Subsystem,该通道启用,否则读出 0
  • [19:16]: 4'h0 - H2C Channels
  • [15]: 1'b0 - AXI4 Memory Mapped Interface
  • [11:8]: 4'h0 - Channel 1
  • [7:0]: 8'h06 - 2017.1 to current release

    《pg195-pcie-dma-en-us-4.1》

    4.2.5 xdma0_user 测试

    1)写入设备节点 /dev/xdma0_user,地址为 0x4,数据为 0x0。

    • 设备节点 /dev/xdma0_user 可以理解为 基地址,由 Host 分配。
    • 地址 0x4 可以理解为 偏移地址
    sudo ./reg_rw /dev/xdma0_user 0x4 w 0x0 # axi_gpio out
    ---
    device: /dev/xdma0_user, address: 0x4 (0x0+0x4), access write.
    access width: word (32-bits)
    character device /dev/xdma0_user opened.
    Memory 0x0 mapped at address 0x7fac3e7c0000.
    Write 32-bits value 0x00000000 to 0x4 (0x0x7fac3e7c0004)

    设备节点 /dev/xdma0_user 可访问的地址范围:

    PCIe to AXI Translation        = 0x400000000
    |
    PCIe to AXI Translation + Size = 0x40000FFFF

    我们实际先要操作的寄存器地址是 0x40000004,如下图 Address Editor 所示:

    通过 ILA 查看实际传递到 M_AXI_LITE 的地址:

    sudo ./reg_rw /dev/xdma0_user 0x0 w 0x1 # axi_gpio Highsudo ./reg_rw /dev/xdma0_user 0x0 w 0x0 # axi_gpio Low

    4.2.6 xdma0_bypass 测试

    sudo ./reg_rw /dev/xdma0_bypass 0x4 w 0x0 # axi_gpio outsudo ./reg_rw /dev/xdma0_bypass 0x0 w 0x1 # axi_gpio Highsudo ./reg_rw /dev/xdma0_bypass 0x0 w 0x0 # axi_gpio Low

    4.2.7 xdma0_h2c_0 读写测试

    sudo ./dma_from_device -d /dev/xdma0_c2h_0 -f ./output_datafile0_4K.bin -s 1024 -c 1 &sudo ./dma_to_device -d /dev/xdma0_h2c_0 -f ./datafile0_4K.bin -s 1024 -a 0 -c 1

    成功的标志:

    >>sudo ./dma_to_device -d /dev/xdma0_h2c_0 -f ./datafile0_4K.bin -s 1024 -a 0 -c 1 -v
    ---
    dev /dev/xdma0_h2c_0, addr 0x0, aperture 0x0, size 0x400, offset 0x0, count 1
    host buffer 0x1400 = 0x557119548000
    #0: CLOCK_MONOTONIC 0.000121792 sec. write 1024 bytes
    ** Avg time device /dev/xdma0_h2c_0, total time 121792 nsec, avg_time = 121792.000000, size = 1024, BW = 8.407777
    /dev/xdma0_h2c_0 ** Average BW = 1024, 8.407777

    4.3 调试方法

    4.3.1 xdma cdev init

    调查 ubuntu 启动时,关于 xdma 的 Log:

    sudo dmesg | grep xdma
    ---
    [    7.205815] xdma: loading out-of-tree module taints kernel.
    [    7.222642] xdma: module verification failed: signature and/or required key missing - tainting kernel
    [    7.224451] xdma:xdma_mod_init: Xilinx XDMA Reference Driver xdma v2020.2.2
    [    7.224453] xdma:xdma_mod_init: desc_blen_max: 0xfffffff/268435455, timeout: h2c 10 c2h 10 sec.
    [    7.226197] xdma:xdma_device_open: xdma device 0000:01:00.0, 0x00000000d756b14e.
    [    7.226331] xdma:map_single_bar: BAR0 at 0xe1100000 mapped at 0x0000000063e767e1, length=1048576(/1048576)
    [    7.226340] xdma:map_single_bar: BAR2 at 0xe1300000 mapped at 0x000000007347ea88, length=65536(/65536)
    [    7.226344] xdma:map_bars: config bar 2, pos 1.
    [    7.226349] xdma:map_single_bar: BAR4 at 0xe1200000 mapped at 0x0000000023370d3e, length=1048576(/1048576)
    [    7.226351] xdma:identify_bars: 3 BARs: config 1, user 0, bypass 4.
    [    7.228186] xdma:pci_keep_intx_enabled: 0000:01:00.0: clear INTX_DISABLE, 0x406 -> 0x6.
    [    7.228245] xdma:probe_one: 0000:01:00.0 xdma0, pdev 0x00000000d756b14e, xdev 0x000000002e86ec3b, 0x00000000fc2eb3b5, usr 16, ch 1,1.
    [    7.255484] xdma:cdev_xvc_init: xcdev 0x0000000045e9570d, bar 0, offset 0x40000.

    日志关键信息的解读:

    1)xdma: loading out-of-tree module taints kernel.

    • 表明 xdma 模块正在被加载。它是一个 "out-of-tree" 模块(不是内核自带的),是另外编译安装的(非官方代码),加载这类模块会 "污染" (taint) 内核。

    2)xdma:xdma_mod_init: Xilinx XDMA Reference Driver xdma v2020.2.2

    • 驱动的初始化函数 xdma_mod_init 已经开始执行,并打印了驱动的版本号。

    3)xdma:xdma_device_open: xdma device 0000:01:00.0, ...

    • 成功检测到了一个 PCI 设备,其地址为 0000:01:00.0。

    4)xdma:map_single_bar: BAR0 ... mapped ...

    • 驱动成功映射了设备的 PCI BARs。

    5)xdma:probe_one: 0000:01:00.0 xdma0, ...

    • probe_one 函数成功完成了对设备 0000:01:00.0 的探测和初始化,并将其命名为 xdma0。

    6)xdma:cdev_xvc_init: ...

    • 其他初始化,创建字符设备接口 (cdev),用于用户空间程序与驱动交互。

    4.3.2 h2c status

    查询 H2C 的第一个通道 H2C Channel Status (0x40) 信息

    >> sudo ./reg_rw /dev/xdma0_control 0x0040
    ---
    access width: word (32-bits)
    character device /dev/xdma0_control opened.
    Memory 0x0 mapped at address 0x7f590b853000.
    Read 32-bit value at address 0x40 (0x7f590b853040): 0x00000001

    4.3.3 xfer timed out

    发起 DMA 传输

    sudo ./dma_to_device -d /dev/xdma0_h2c_0 -f ./datafile0_4K.bin -s 512 -a 0 -c 1
    ---
    /dev/xdma0_h2c_0, write 0x200 @ 0x0 failed -1.
    write file: Unknown error 512

    查看调试信息

    sudo dmesg | grep xdma
    ---
    [   83.849094] xdma:xdma_xfer_submit: xfer 0x00000000a31d2506,512, s 0x1 timed out, ep 0x200.
    [   83.849110] xdma:engine_reg_dump: 0-H2C0-ST: ioread32(0x000000007347ea88) = 0x1fc08006 (id).
    [   83.849118] xdma:engine_reg_dump: 0-H2C0-ST: ioread32(0x000000001f564581) = 0x00000000 (status).
    [   83.849124] xdma:engine_reg_dump: 0-H2C0-ST: ioread32(0x00000000300420f2) = 0x00f83e1e (control)
    [   83.849130] xdma:engine_reg_dump: 0-H2C0-ST: ioread32(0x00000000874345b5) = 0x0d7e0000 (first_desc_lo)
    [   83.849135] xdma:engine_reg_dump: 0-H2C0-ST: ioread32(0x000000002a6151a7) = 0x00000001 (first_desc_hi)
    [   83.849140] xdma:engine_reg_dump: 0-H2C0-ST: ioread32(0x0000000026f28b23) = 0x00000000 (first_desc_adjacent).
    [   83.849145] xdma:engine_reg_dump: 0-H2C0-ST: ioread32(0x00000000ccba4cf2) = 0x00000000 (completed_desc_count).
    [   83.849150] xdma:engine_reg_dump: 0-H2C0-ST: ioread32(0x00000000f18f3588) = 0x00f83e1e (interrupt_enable_mask)
    [   83.849157] xdma:engine_status_dump: SG engine 0-H2C0-ST status: 0x00000000:
    [   83.849161] xdma:transfer_abort: abort transfer 0x00000000a31d2506, desc 1, engine desc queued 0.

    核心错误信息:

    xdma:xdma_xfer_submit: xfer 0x.. ,512, s 0x1 timed out, ep 0x200.
    • xdma_xfer_submit:驱动程序提交一个 DMA 传输请求,大小是 512 字节。
    • timed out:传输超时。这是问题的核心。驱动程序启动了传输,但在预设的时间内(默认为 10 秒)没有收到来自硬件(FPGA)的完成信号。
    • ep 0x200: 指示发生超时的引擎端点,对应于 H2C 通道 0 (/dev/xdma0_h2c_0)。

    解决办法:

    添加时序约束,并使用 Performance_Explore 策略,确保没有时序违例:

    create_clock -period 10.000 -name {pcie_cref_clk_p[0]} -waveform {0.000 5.000} [get_ports {pcie_cref_clk_p[0]}]

    不同于 DDR 的参考时钟,vivado 工具会自动添加相关约束,xdma ip 并不会添加时钟约束,及时双击信号已经显示为 100MHz。可能是因为 xdma ip 的参考时钟是可选的(100/125/250)。

    4.3.4 Debug Options

    参考:《XAPP1198

    • In-system IBERT 可提供 PCIe 链接眼图。
    • JTAG Debugger 和 In-system IBERT 功能结合在一起即可提供即时信息,用于判断链接训练错误的可能原因。

    PCIe In-system IBERT 特点:

    非侵入性检测:运行眼图扫描不影响链路完整性,保持信号裕量表征,结合收发器均衡器提供接收端信号裕量的最准确分析。

    无需预设测试模式:PCI Express 链路很少使用环回模式,通常无预设测试模式,系统内眼图扫描可直接应用于运行中的链路。

    容忍比特错误:即使存在比特错误,PCI Express 链路仍可保持在 L0 状态,通过 CRC 校验和重放机制确保数据完整性(但重放机制可能影响吞吐量)。

    快速定位问题通道:多通道实现中,眼图扫描可快速识别信号裕量不足的具体通道,避免逐条排查的困难。

    反映真实系统条件:扫描结果包含实际运行时依赖(如功耗、开关噪声等),覆盖空闲模式、DMA 模式等极端情况,无需人为启用测试模式。

    扫描条件: 

    4.3.5 信号完整性问题

    1)通过延长线进行连接

    >> sudo lspci -vv -s 01:00.0
    ---
    01:00.0 Serial controller: Xilinx Corporation Device 9034 (prog-if 01 [16450])Subsystem: Xilinx Corporation Device 0007Control: I/O- Mem- BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-Interrupt: pin A routed to IRQ 16Region 0: Memory at e1100000 (32-bit, non-prefetchable) [virtual] [size=1M]Region 1: Memory at e1200000 (32-bit, non-prefetchable) [virtual] [size=64K]
    ...LnkSta: Speed 8GT/s (ok), Width x4 (ok)
    ...Capabilities: [1c0 v1] Secondary PCI ExpressLnkCtl3: LnkEquIntrruptEn-, PerformEqu-LaneErrStat: LaneErr at lane: 0 2Kernel modules: xdma

    要点:

    • 可以识别 9034
    • 重要功能无法使用,Control: Mem- BusMaster-
    • PCIe Lane通道错误,LaneErrStat: LaneErr at lane: 0 2
    • 可以看到 Kernel modules: xdma

    2)直接连接 PCIe 板卡到主板

    >> sudo lspci -vv -s 01:00.0
    ---
    01:00.0 Serial controller: Xilinx Corporation Device 9034 (prog-if 01 [16450])Subsystem: Xilinx Corporation Device 0007Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-Latency: 0Interrupt: pin A routed to IRQ 141Region 0: Memory at e1100000 (32-bit, non-prefetchable) [size=1M]Region 1: Memory at e1200000 (32-bit, non-prefetchable) [size=64K]
    ...LnkSta: Speed 8GT/s (ok), Width x4 (ok)
    ..Capabilities: [1c0 v1] Secondary PCI ExpressLnkCtl3: LnkEquIntrruptEn-, PerformEqu-LaneErrStat: 0Kernel driver in use: xdmaKernel modules: xdma

    要点:

    • 可以识别 9034
    • 功能正常识别,Control: Mem+ BusMaster+
    • 可以看到 Kernel driver in use: xdma

    5. 总结

    本文详细介绍了基于 Xilinx ZCU102 开发板的 PCIe DMA 子系统设计与实现。

    • DMA/Bridge Subsystem for PCIe 作为核心数据搬运引擎,通过描述符(Descriptor)实现主机内存与 FPGA 间的高效数据传输,支持连接不同AXI从设备(如 BRAM、DDR 或硬件加速器)。
    • 在 ZCU102 平台上,Ubuntu 系统通过 PCIe 驱动(xdma.ko)管理设备,利用 lspci、setpci 等工具进行拓扑分析和寄存器配置。
    • Vivado 工程中,XDMA IP 核的配置需注意 BAR 空间分配、时钟约束(如 IBUFDS_GTE 使用)及中断模式选择(轮询/中断)。
    • 实际测试中,通过 reg_rw 和 dma_to_device 等工具验证了 H2C/C2H 通道传输功能,并针对信号完整性(如 PCIe 链路眼图扫描)和时序问题提供了调试方法。

    相关文章:

    PCIe - ZCU106(RC) + KU5P(EP) + 固化

    目录 1. 简介 1.1 Data Mover 1.2 描述符 2. ZCU102 2.1 Ubuntu OS 2.2 USB Host 2.2.1 连接拓扑 2.2.2 设备类型 2.2.3 USB 跳帽设置 2.3 无线网卡 2.4 PCIe Info 2.4.1 Diagram 2.4.2 lspci -tv 2.4.3 lspci -v 2.4.2.1 设备基本信息 2.4.2.2 控制与状态寄存…...

    网络编程核心技术解析:从Socket基础到实战开发

    网络编程核心技术解析&#xff1a;从Socket基础到实战开发 一、Socket编程核心基础 1. 主机字节序与网络字节序&#xff1a;数据传输的统一语言 在计算机系统中&#xff0c;不同架构对多字节数据的存储顺序存在差异&#xff0c;而网络通信需要统一的字节序标准&#xff0c;这…...

    SQL注入总结

    一.sql注入 原理&#xff1a;当一个网站存在与用户交互的功能&#xff08;如登录表单、搜索框、评论区等&#xff09;&#xff0c;并且用户输入的数据未经充分过滤或转义&#xff0c;直接拼接到后台数据库查询语句中执行时&#xff0c;就可能引发SQL注入漏洞。攻击者可以通过构…...

    conda 安装cudnn

    通过 Conda 安装 cuDNN 确保你有 NVIDIA GPU 和 CUDA Toolkit&#xff1a;首先&#xff0c;确保你的系统上安装了 NVIDIA GPU 和 CUDA Toolkit。你可以通过运行以下命令来检查 CUDA 是否已安装&#xff1a;nvcc --version 如果没有安装 CUDA&#xff0c;你需要先从 NVIDIA CU…...

    强啊!Oracle Database 23aiOracle Database 23ai:使用列别名进行分组排序!

    大家好&#xff0c;这里是架构资源栈&#xff01;点击上方关注&#xff0c;添加“星标”&#xff0c;一起学习大厂前沿架构&#xff01; 从 Oracle Database 23ai 开始&#xff0c;您可以在 GROUP BY 和 HAVING 子句中直接使用列别名。此功能在早期版本的 Oracle Database 中不…...

    RAG 2.0 深入解读

    一、Introduction 过去一年可谓是RAG元年&#xff0c;检索增强生成技术迅速发展与深刻变革&#xff0c;其创新与应用已深刻重塑了大模型落地的技术范式。站在2025年&#xff0c;RAG不仅突破了早期文本处理的局限&#xff0c;更通过多模态融合、混合检索优化和语义鸿沟跨越等突…...

    Excel Vlookup

    VLOOKUP(A2, Sheet2!A:B, 2, 0) 代表的是检查A2,匹配源是sheet2表AB两列 Sheet2!A:B&#xff1a;指定要在其中查找数据的范围&#xff0c;这里是 Sheet12中的 A 列和 B 列&#xff0c;A 列是查找的依据列&#xff0c;B 列是要返回值的列。2&#xff1a;表示要返回查找区域中的…...

    css媒体查询及css变量

    媒体查询是 CSS 样式表最重要的功能之一&#xff0c;所谓媒体查询指的就是根据不同的媒体类型&#xff08;设备类型&#xff09;和条件来区分各种设备&#xff08;例如&#xff1a;电脑、手机、平板电脑、盲文设备等&#xff09;&#xff0c;并为它们分别定义不同的 CSS 样式。…...

    CSS网格布局

    网格布局将元素占用的空间划分为二维格子&#xff0c;下级元素放置在格子所在的位置上。划分格子的元素叫做网格容器&#xff0c;其 display 属性是 grid &#xff08;块元素&#xff09;或 inline-grid &#xff08;内联块元素&#xff09;。网格容器的下级元素叫做网格项。容…...

    Windows远程连接MySQL报错,本地navicat能连接MySQL

    一、报错 telnet 119.87.111.79 3306​​“无法打开到主机的连接。在端口 3306: 连接失败”​​ 表明无法通过 TCP 协议连接到目标服务器的 3306 端口。 二、目的 &#xff08;1&#xff09;​​Telnet 测试的目的​​ Telnet 仅用于测试 ​​TCP 端口是否开放​​&#xff…...

    Github打不开怎么办?

    国内无法打开github&#xff0c;使有watt toolkit一键加速即可打开。 加速器 加速器直接加速Github原站&#xff0c;在开发者使用或者需要登录账号时非常有效 Watt Toolkit&#xff08;原Steam&#xff09; 官网地址&#xff1a;Watt Toolkit 一、进入官网后&#xff0c;点…...

    亿级流量系统架构设计与实战(四)

    本章关键词 : 读 / 写分离 、 数据缓存 、 缓存更新 、 CQRS 、 数据分片 、 异步写。 高并发架构设计的要点 形成高并发系统的必要条件 高性能、高可用、可扩展。 高性能: 性能代表一个系统的并行处理能力,在同样的硬件设备条件下 , 性能越高 , 越能节约硬件资源。高可…...

    Java基础问题——八股盛宴 | 3w字分享

    目录 面向对象与面向过程的区别&#xff1f; Java面向对象有哪些特征&#xff0c;如何应用&#xff1f; 介绍下Java中的四种引用&#xff1f; Java中创建对象有几种方式&#xff1f; Java中的序列化和反序列化是什么&#xff1f; 什么是Java中不可变类&#xff1f; Java…...

    保障企业的数据安全需要做什么?

    守护企业数据安全&#xff0c;犹如构筑一座固若金汤的城堡&#xff0c;需要从技术壁垒、管理护城河、流程吊桥和人员守卫等多维度精心布局&#xff0c;打造环环相扣的立体防御体系。我们从以下关键项分析&#xff1a; 一、技术层面 数据加密 对敏感数据&#xff08;如客户信息、…...

    Flutter开发IOS蓝牙APP的大坑

    Core Bluetooth 框架限制&#xff1a;iOS 的 Core Bluetooth 框架存在限制&#xff0c;如果指定的特征配置同时允许通知&#xff08;Notifications&#xff09;和指示&#xff08;Indications&#xff09;&#xff0c;调用相关方法设置通知值时&#xff0c;默认仅会开启通知功能…...

    LeetCode 解题思路 45(分割等和子集、最长有效括号)

    解题思路&#xff1a; dp 数组的含义&#xff1a; 在数组中是否存在一个子集&#xff0c;其和为 i。递推公式&#xff1a; dp[i] | dp[i - num]。dp 数组初始化&#xff1a; dp[0] true。遍历顺序&#xff1a; 从大到小去遍历&#xff0c;从 i target 开始&#xff0c;直到 …...

    AI Agent 入门指南:从 LLM 到智能体

    AI. AI. AI. 最近耳朵里是不是总是被这些词轰炸&#xff1f;特别是“Agent”、“AI Agent”、“智能体”、“Agentic”…… 感觉一夜之间&#xff0c;AI 就从我们熟悉的聊天框里蹦出来&#xff0c;要拥有“独立思考”和“自主行动”的能力了&#xff1f; 说实话&#xff0c;一…...

    高级java每日一道面试题-2025年5月02日-基础篇[反射篇-编码]-使用反射,获取Class对象

    如果有遗漏,评论区告诉我进行补充 面试官: 编写代码通过三种方式&#xff08;类名.class、对象.getClass()、Class.forName()&#xff09;获取java.util.ArrayList的Class对象。 我回答: 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#…...

    【bug】fused_bias_act_kernel.cu卡住没反应

    简述 在推理人脸修复face restoration算法 GPEN的时候&#xff0c;发现有时候fused_bias_act_kernel.cu卡住没反应。 解决 清理下缓存&#xff0c;让程序自己再编译下...

    小游戏(2)扫雷游戏

    一、简述 鸽子的时间太长了&#xff0c;其实学完数组和函数就应该搞出来这个丐版的小游戏了&#xff0c;不耽误&#xff0c;反正总归是轮到了&#xff0c;嘻嘻。 二、依旧菜单\. 我们这里写的是一个丐版的扫雷游戏&#xff0c;难度就固定了&#xff0c;所以菜单写起来就是玩游…...

    如何在vscode中set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`

    1.打开工作区设置文件 在 VS Code 中通过文件 -> 首选项 -> 设置&#xff0c;接着在设置窗口的右上角点击打开设置&#xff08;JSON&#xff09;&#xff0c;这会打开settings.json文件。 2.添加环境变量设置 "terminal.integrated.env.linux": { "TF_EN…...

    leetcode 24. 两两交换链表中的节点

    题目描述 代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), next(next…...

    微调大模型如何准备数据集——常用数据集,Alpaca和ShareGPT

    微调大模型如何准备数据集——常用数据集,Alpaca和ShareGPT 数据集准备常用数据集自定义数据集AlpacaShareGPT数据集准备 常用数据集 预训练数据集 Wiki Demo (en)RefinedWeb (en)RedPajama V2 (en)Wikipedia (en)Wikipedia (zh)Pile (en)...

    使用Homebrew下载配置git和连接GitHub(Mac版)

    本文详细介绍了在M系列Mac上安装Homebrew并配置Git的过程&#xff0c;包括git的下载、设置全局用户名和邮箱、生成SSH密钥、添加GitHubSSH密钥以及终端验证。这些步骤有助于用户顺利进行协同开发。 一、下载git 1、终端输入一下命令 brew install git2、这时下载完成 二、配…...

    电子电器架构 --- 网关转发时延解析

    我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...

    shell-流程控制-循环-函数

    1. 2. 3.获取当前目录下的普通文件的文件名作为变量列表打印输出 4.打印出下面语句中字符数不大于6的单词 rabbit is favorite to eat cabbage 5.Shell允许用户指定for语句的步长。当用户需要另外指定步长时 6.批量创建用户&#xff1a; 用户名以test开头&#xff0c;按数字序号…...

    Paramiko 性能优化详解

    1. 复用连接&#xff1a;减少 SSH 连接开销 SSH 连接的建立涉及 TCP 握手、密钥交换、身份认证等步骤&#xff0c;频繁创建连接会显著降低性能。复用连接是核心优化手段。 优化方法 手动创建 Transport 对象并复用通过同一 Transport 执行多种操作&#xff08;命令、SFTP、端…...

    代码随想录图论part03

    第十一章&#xff1a;图论part03 孤岛的总面积 &#xff08;深搜&#xff09; 代码随想录 孤岛问题&#xff1a;先处理边缘岛在处理孤岛 沉没孤岛 &#xff08;广搜&#xff09; 代码随想录 水流问题 代码随想录 目的&#xff1a;找水源 思路;逆向思考&#xff0c;找两…...

    树上背包学习笔记

    树上背包&#xff0c;顾名思义&#xff0c;就是在树上跑背包。每日顾名思义 Q&#xff1a;那么到底为什么要树上跑背包 dp 呢&#xff1f; A&#xff1a;因为我们到现在学的背包 dp 还是属于较浅的一类&#xff0c;什么 01 背包、完全背包还是多重背包&#xff0c;但是如果这…...

    CPU:为什么Ryzen 7000系列处理器PCIe通道总数是28,而可用的通道数是24?

    AMD Ryzen 7000系列&#xff08;Zen 4架构&#xff09;处理器的 28条PCIe 5.0通道 中&#xff0c;有 4条固定用于连接主板芯片组&#xff08;如X670/B650&#xff09;&#xff0c;剩余的 24条直接分配给用户设备。以下是具体分配逻辑&#xff1a; 1. PCIe通道的总分配 24条直连…...

    OpenCV 图形API(80)图像与通道拼接函数-----仿射变换函数warpAffine()

    操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 对图像应用仿射变换。 函数 warpAffine 使用指定的矩阵对源图像进行变换&#xff1a; dst ( x , y ) src ( M 11 x M 12 y M 13 , M 21 x M…...

    巧记英语四级单词 Unit7-下【晓艳老师版】

    navigate v. 航行&#xff0c;航空 那六扇门gatevibrate v.颤抖&#xff0c;抖动 男生早上起来看到六个文胸在那挂着&#xff0c;春心荡漾virtual a.事实上&#xff0c;实际上的 发音“龌龊”&#xff1b;通常lyvia prep.经过 a想成小乌龟&#xff0c;兔子想到河对面吃草&am…...

    idea使用lombok错误,找不到符号,明明编译没问题,运行报错

    lombok使用出现的问题 问题找不到方法 经常遇到这样的小伙伴看到这个是不是一头雾水&#xff0c;明明我编译没有我问题&#xff0c;运行就出现问题&#xff0c;真的很生气。 下面介绍解决这个问题的几种方法。 开启 annotation processing 开启之后重启&#xff0c;试试有…...

    Transformer面经

    请问你对Transformer有什么了解 简要回答的话可以这样&#xff1a; Transformer是一种基于自注意力机制的神经网络架构&#xff0c;它主要用于处理序列数据&#xff0c;如自然语言处理。 核心的组件有&#xff1a;自注意力机制&#xff08;计算序列中每个元素与其他元素的相…...

    学习Python的第二天之网络爬虫

    30岁程序员学习Python的第二天之网络爬虫的信息提取 BeautifulSoup库 地址&#xff1a;https://beautifulsoup.readthedocs.io/zh-cn/v4.4.0/ 1、BeautifulSoup4安装 在windows系统下通过管理员权限运行cmd窗口 运行pip install beautifulsoup4 测试实例 import requests…...

    【基础】Python包管理工具uv使用教程

    一、uv简介 uv 是由 Astral&#xff08;前身为 Basis&#xff09;团队开发的 Python 包安装器和解析器&#xff0c;完全使用 Rust 语言编写。与传统 Python 工具不同&#xff0c;uv 将多个工具的功能整合到一个高性能的解决方案中&#xff0c;旨在提供更现代、更高效的 Python…...

    【十五】Mybatis动态SQL实现原理

    Mybatis动态SQL实现原理 目录 Mybatis动态SQL实现原理 概述 动态 SQL 实现原理 总结 概述 每天日常开发都在使用mybatis&#xff0c;但是很多人并没有花心思去理解mybatis的实现原理&#xff0c;一直处于使用阶段&#xff0c;程序员的使命是改变世界&#xff0c;这一点可能…...

    UE5 把翅膀动画额外创建动画蓝图并和角色绑定混合动画

    把翅膀和角色合并,把翅膀绑在Spine_3上 在5.3内,需要LayerSetup指定骨骼才能使用混合...

    Coding Practice,48天强训(30)

    Topic 1&#xff1a;爱吃素&#xff08;素数性质&#xff09; 爱吃素 在强训25的第一题我总结过关于素数的几种判断方式&#xff0c;如果忘了可以回去看 第一次写我是这样写的 #include <bits/stdc.h> using namespace std;bool isPrime(long long &a, long long …...

    华为私有协议Hybrid

    实验top图 理论环节 1. 基本概念 Hybrid接口&#xff1a; 支持同时处理多个VLAN流量&#xff0c;且能针对不同VLAN配置是否携带标签&#xff08;Tagged/Untagged&#xff09;。 核心特性&#xff1a; 灵活控制数据帧的标签处理方式&#xff0c;适用于复杂网络场景。 2. 工作…...

    神经网络之互动练习详解:从基础到拟合非线性数据

    神经网络之互动练习详解&#xff1a;从基础到拟合非线性数据 在机器学习的世界里&#xff0c;神经网络是一种强大而神奇的工具&#xff0c;它可以帮助我们解决各种复杂的问题。今天&#xff0c;我们就通过一个有趣的互动练习&#xff0c;来深入了解神经网络的工作原理以及如何…...

    遨游科普:2025年,三防平板有多智能?

    在极端环境与复杂场景中&#xff0c;专业设备的可靠性始终是行业应用的核心命题。随着物联网、5G通信与边缘计算技术的深度融合&#xff0c;三防平板已突破传统“坚固耐用”的单一属性&#xff0c;进化为集多模通讯、智能感知与场景化扩展于一体的移动智能终端。 AORO P9000三防…...

    基于C++的IOT网关和平台7:github项目ctGateway设备协议开发指南

    初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。 源码指引:github源码指引_初级代码游戏的博客-CSDN博客 系…...

    yolov8中的python基础--模块导入篇

    import语句有几种不同的写法&#xff0c;它们有不同的用途和优势。 1. 直接 import 语法 import module_name 用途 导入整个模块&#xff0c;使用时需要通过模块名访问其中的内容。 示例 import os print(os.listdir()) # 必须用 os. 前缀 适用场景 当需要频繁使用模块…...

    26.2Linux中SPI的驱动实验(编程)_csdn

    我尽量讲的更详细&#xff0c;为了关注我的粉丝&#xff01;&#xff01;&#xff01; 这里我们用到的是stm32mp157的板子&#xff0c;所以我们看一下SPI用到的引脚。 1、硬件原理图分析 SPI1_MOSI&#xff08;对应芯片引脚 SDA/SDI &#xff09;&#xff1a;主机输出从机输入…...

    uv简单使用

    通过uv创建项目和虚拟环境 初始化项目 uv init --package my-project 初始化一个名为 my-project 的新项目&#xff0c;并生成必要的文件结构。 创建虚拟环境 uv venv .venv 激活虚拟环境 # For Windows .venv\Scripts\activate# For macOS/Linux source .venv/bin/acti…...

    扩增子分析|微生物生态网络稳定性评估之鲁棒性(Robustness)和易损性(Vulnerability)在R中实现

    一、引言 周集中老师团队于2021年在Nature climate change发表的文章&#xff0c;阐述了网络稳定性评估的原理算法&#xff0c;并提供了完整的代码。自此对微生物生态网络的评估具有更全面的指标&#xff0c;自此网络稳定性的评估广受大家欢迎。本系列将介绍网络稳定性之鲁棒性…...

    线性回归评价标准

    In [1]: 12345 import numpy as npfrom sklearn.linear_model import LinearRegressionimport sklearn.datasets as datasets 12 ()diabetesdiabetes $$datasets.load_diabetes In [2]: Out[2]: {‘data’: array([[ 0.03807591,0.05068012,0.06169621,…,-0.00259226, 0.0…...

    Qt—鼠标移动事件的趣味小程序:会移动的按钮

    1.项目目标 本次根据Qt的鼠标移动事件实现一个趣味小程序&#xff1a;当鼠标移动到按钮时&#xff0c;按钮就会随机出现在置&#xff0c;以至于根本点击不到按钮。​​​​​ 2.项目步骤 首先现在ui界面设计控件(也可以用代码的方式创建&#xff0c;就不多说了) 第一个按钮不需…...

    深度解析:2D 写实交互数字人 —— 开启智能交互新时代

    在当今数字化浪潮汹涌澎湃的 era&#xff0c;人机交互模式正经历着前所未有的变革与重塑。从最初冷冰冰的机械按键&#xff0c;到如今灵动逼真的数字化形象&#xff0c;交互的内涵不断拓展&#xff0c;已不再局限于信息的单向传递&#xff0c;情感交流、场景融合等多维度需求逐…...