应用挂起也可能是由于从主机代码发起的 DMA 传输不完整而造成的。这不一定意味着主机代码错误,也可能是因为内核发出了违规传输事务并锁定了 AXI。
- 如果平台拥有 AXI 防火墙(如在 Vitis 平台中),则有可能会脱扣。驱动程序会发出
SIGBUS
错误、终止该应用并复位器件。可通过运行以下命令来检查此对象:xbutil examine -d <bdf> -r firewall
下图显示了防火墙状态中的此类错误:
Firewall Last Error Status: 0: 0x0 (GOOD) 1: 0x0 (GOOD) 2: 0x80000 (RECS_WRITE_TO_BVALID_MAX_WAIT). Error occurred on Tue 2017-12-19 11:39:13 PST Xclbin ID: 0x5a39da87
提示: 如果防火墙未脱扣,则 Linux 工具dmesg
可提供更多洞察。 - 如果已知防火墙脱扣,则重要的是确定 DMA 超时的原因。该问题可能是由于存在违规 DMA 传输或内核行为不当而导致的。但是,AXI 防火墙脱扣的副作用是驱动程序中的运行状况检查功能会在终止应用之后复位开发板,器件上可能有助于调试根本原因的任何信息都会丢失。要调试该问题,请禁用
xclmgmt
内核模块中的运行状况检查线程,以捕获错误。此操作将按照以下顺序使用通用 Unix 内核工具:-
sudo modinfo xclmgmt
:该命令列出模块的当前配置并指示health_check
参数是 ON(开启)还是 OFF(关闭)。它同时返回指向xclmgmt
模块的路径。 -
sudo rmmod xclmgmt
:移除并禁用xclmgmt
内核模块。 -
sudo insmod <path to module>/xclmgmt.ko health_check=0
:此命令将重新安装xclmgmt
内核模块并禁用运行状况检查。提示: 在modinfo
调用的输出中会报告此模块的路径。
-
- 在禁用运行状况检查的情况下,重新运行应用。您可以按前述方法使用内核检测来隔离此问题。