如何判断ZYNQ 7000的DMA中断是否正常及查找UIO对应中断号
问题背景
我通过Jtag、tftpboot将Linux启动到AVNET ZYNQ 7000开发板,之后改为从QSPI启动。项目目标是通过DMA实现PS与PL间的数据传输,已用VIVADO完成设计并通过Petalinux启动Linux。运行测试代码时程序卡在“等待中断”状态,因此想检查中断是否正常工作。在板端终端执行cat /proc/interrupts后,得到30至38号中断信息,示例(30号):
30: 0 0 GIC-0 46 level f8003000.dma.controller
我的system-user.dtsi文件内容如下:
/include/ "system-conf.dtsi" / { chosen { bootargs = "earlycon clk_ignore_unused uio_pdrv_genirq.of_id=generic-uio rootwait quiet loglevel=0"; stdout-path = "serial0:115200n8"; }; }; &axi_dma_0 { compatible = "generic-uio"; interrupt-parent = <0x1>; interrupts = <0 29 4 0 30 4>; }; &qspi { #address-cells = <1>; #size-cells = <0>; flash0: flash@0 { compatible = "n25q512a","micron,m25p80","jedec,spi-nor"; spi-max-frequency = <50000000>; reg = <0x0>; #address-cells = <1>; #size-cells = <1>; }; };
核心问题
- 能否通过
cat /proc/interrupts的输出判断我的中断是否正常工作? - 如何找到UIO读命令有数据可用时应触发的中断号?
回答
问题1:通过cat /proc/interrupts判断中断是否正常工作
可以初步判断,核心看输出里的中断计数:
- 输出中
30: 0 0 ...里的数字是该中断的触发次数。如果你的DMA测试代码已经尝试触发中断,但计数始终为0,说明中断未被触发或未被内核正确捕获。结合你程序卡在“等待中断”的现象,大概率中断没有正常工作。 - 另外,输出里的
level表示中断为电平触发,和你设备树中配置的<0 29 4>/<0 30 4>里的4(对应IRQ_TYPE_LEVEL_HIGH)匹配,触发类型配置无问题。
问题2:找到UIO读命令对应中断号
方法1:结合硬件设计与设备树
ZYNQ的AXI DMA通常有两个中断:对应发送完成(TX)和接收完成(RX),UIO读数据可用时,对应DMA的接收完成(RX)中断。
- 打开VIVADO中的AXI DMA IP配置界面,查看中断映射,确认RX中断对应的硬件中断号(即设备树中
<0 X 4>里的X值),对应你设备树里的29或30号。
方法2:通过sysfs节点查询
挂载UIO设备后,进入对应目录查询:
- 进入
/sys/class/uio/uioX/(X为UIO设备编号,如uio0),查看name文件确认是axi_dma_0对应的设备; - 查看
irq文件,获取该UIO设备绑定的内核中断号,再对应/proc/interrupts里的信息,找到对应的硬件中断号; - 进入
/sys/bus/platform/devices/f8003000.dma.controller/(对应/proc/interrupts里的设备名),查看interrupts文件,里面会列出该DMA注册的所有中断号,和设备树配置一一对应。
方法3:测试验证
分别触发DMA的TX和RX操作,观察/proc/interrupts里哪个中断的计数增加:
- 执行一次PL到PS的DMA传输(触发RX),若29或30号中断计数上升,该中断即为UIO读数据可用时的触发中断。
内容的提问来源于stack exchange,提问作者Creator
相关产品推荐
相关产品推荐

