为帮助您熟悉使用命令行进行调试的流程,本示例将为您逐步讲解构建和调试赛灵思 GitHub 上提供的 IDCT 示例的过程。
- 在终端内,按 设置 Vitis 环境 中所述设置您的环境。
- 请首先克隆 Vitis 示例 GitHub 仓库,以获取所有 Vitis 示例:
git clone https://github.com/Xilinx/Vitis_Accel_Examples.git
这样即可创建包含 IDCT 示例的 Vitis_Examples 目录。
- 使用 CD 命令转至 IDCT 示例目录:
cd Vitis_Examples/vision/idct/
主机代码完全包含在 src/idct.cpp 中,内核代码则包含在 src/krnl_idct.cpp 中。
- 构建内核软件用于软件仿真 (software emulation),如 构建器件二进制文件 中所述。
- 编译内核对象文件,以便使用
v++
编译器进行调试,其中-g
表示编译的代码用于调试:v++ -t sw_emu --platform <DEVICE> -g -c -k krnl_idct \ -o krnl_idct.xo src/krnl_idct.cpp
- 链接内核对象文件,并指定
-g
:v++ -g -l -t sw_emu --platform <DEVICE> -config config.cfg \ -o krnl_idct.xclbin krnl_idct.xo
--config
选项用于指定配置文件 config.cfg,其中包含构建进程(如 Vitis 编译器配置文件 中所述)的指令。配置文件内容如下:kernel_frequency=250 [connectivity] nk=krnl_idct:1:krnl_idct_1 sp=krnl_idct_1.m_axi_gmem0:DDR[0] sp=krnl_idct_1.m_axi_gmem1:DDR[0] sp=krnl_idct_1.m_axi_gmem2:DDR[1] [advanced] prop=solution.hls_pre_tcl='src/hls_config.tcl"
- 编译内核对象文件,以便使用
- 编译并链接主机代码,以便使用 GNU 编译器链
g++
进行调试,如 构建主机程序 中所述:- 编译主机代码 C++ 文件,以便使用
-g
选项进行调试:g++ -c -I${XILINX_XRT}/include -g -o idct.o src/idct.cpp
- 链接对象文件,以便使用
-g
进行调试:g++ -g -lOpenCL -lpthread -lrt -lstdc++ -L${XILINX_XRT}/lib/ -o idct idct.o
- 编译主机代码 C++ 文件,以便使用
- 如 emconfigutil 实用工具 中所述,使用以下命令准备仿真 (emulation) 环境:
emconfigutil --platform <device>
随后,需通过XCL_EMULATION_MODE
环境变量来设置实际仿真模式(sw_emu
或hw_emu
)。在 C-shell 中,操作如下:setenv XCL_EMULATION_MODE sw_emu
- 如 xrt.ini 文件 中所述,您必须设置运行时以供调试。在已编译的主机应用所在目录中,创建包含以下内容的 xrt.ini 文件:
[Debug] app_debug=true
- 在主机和内核代码上运行 GDB。以下步骤用于指引您完成命令行调试进程,此进程需要 3 个独立的命令终端,其设置如 设置 Vitis 环境 中所述。
- 在第一个终端内,启动 XRT 调试服务器,用于处理主机与内核代码之间的传输事务:
${XILINX_VITIS}/bin/xrt_server --sdx-url
- 在第二个终端中,设置仿真模式:
setenv XCL_EMULATION_MODE sw_emu
执行以下操作,运行 GDB:xgdb –-args idct krnl_idct.xclbin
出现gdb
提示时,输入以下内容:run
- 在第三个终端中,将软件仿真模型连接到 GDB 以单步调试整个设计。启动另一个
xgdb
:xgdb
- 对于软件仿真中的调试:
- 出现
gdb
提示时,输入以下内容:file <XILINX_VITIS>/data/emulation/unified/cpu_em/generic_pcie/model/genericpciemodel
注释: 由于 GDB 不会展开环境变量,您必须指定到 Vitis 软件平台安装的路径,此路径以<XILINX_VITIS>
来表示
- 出现
- 连接到内核进程:
target remote :NUM
其中
NUM
是xrt_server
返回的作为 GDB 监听器端口的端口号。
此时,即可照常使用 GDB 来执行主机与内核代码调试,主机代码和内核代码在两个不同的 GDB 会话内运行。在处理不同进程时,此操作很常见。
重要: 请注意,应用可能先在某一进程中命中一个断点,然后在另一个进程中命中下一个断点。在此类情况下,其中一个终端内的调试会话会显示为挂起,另一个终端则处于等待输入状态。 - 对于软件仿真中的调试:
- 在第一个终端内,启动 XRT 调试服务器,用于处理主机与内核代码之间的传输事务: