vitis2021.1 armr5-none-eabi-objcopy -O binary elf文件转bin文件变大

把编译的程序文件尾缀elf变成bin文件,编译的是xilinx 4ev R5核的裸机程序。

本来是一件很简单的事情,输入下面命令即可。

armr5-none-eabi-objcopy -O binary c_project_r5_app0.elf c_project_r5_app0.bin

但是编译出来的bin文件无法运行,排查文件大小,发现bin文件变得非常大,比elf文件还大。

很明显这不对劲,理论来说,elf文件变成bin文件应该会变小的,现在反了。

后面创建了一个A53的工程,使用上述命令,居然是正常的,搞的我一度怀疑人生。

最后突然想起是不是程序编译成bin文件进行了数据填充。

在elf文件转化成bin文件的过程中,输出段与段之间如果有空隙的话,objcopy会用0来填充段与段之间的空隙,这将会导致bin文件比elf文件大很多的问题。

为什么出现分段空隙呢,排查R5程序和A53程序,最后发现问题了。

在R5程序的链接文件中发现,.vectors段放在的是r5_0_atcm中,而其他的段都在DDR上。 

<think>我们正在使用Vitis 2021.1版本,目标是将程序通过JTAG模式烧录到QSPI Flash中。通常,在Vitis中烧录QSPI Flash可以通过GUI操作完成,但有时我们需要强制使用JTAG模式(例如,当系统中有多个Flash设备时,需要明确指定使用JTAG连接)。 步骤概述: 1. 打开Vitis IDE,并确保已经构建好硬件平台(XSA文件)和软件应用(ELF文件)。 2.Vitis中,打开“Program Flash”对话框。 3. 在对话框中,我们需要选择Flash类型为QSPI,并强制指定JTAG作为连接方式。 详细步骤: 步骤1:准备工程 - 确保已经将硬件平台(XSA)导入Vitis,并创建了应用工程,生成了可执行的ELF文件。 步骤2:打开Program Flash工具 -Vitis菜单栏中,选择“Xilinx” -> “Program Flash”。如果找不到,可以尝试在菜单栏的“Run” -> “Program Flash”。 - 或者,在Vitis的“Assistant”视图中,找到你的应用工程,右键点击,选择“Program Flash”。 步骤3:配置Program Flash对话框 - 在“Program Flash”对话框中,我们需要设置以下参数: Flash Type: 选择“Quad SPI Flash” Image File: 选择你的ELF文件(或者BOOT.BIN文件,如果使用FSBL的话) Additional Data Files: 如果需要,可以添加其他数据文件(如FSBL) - 关键点:强制使用JTAG模式。在对话框的底部,有一个“Advanced”部分,展开它。 - 在“Advanced”部分,你会看到“Connection”选项。默认情况下,它可能是自动选择(Auto)。我们需要将其改为“JTAG”。 - 此外,确保在“JTAG chain”中选择正确的JTAG设备(你的FPGA/SoC设备)。 步骤4:执行烧录 - 点击“Program”按钮开始烧录。 - 烧录过程中,控制台会显示烧录进度和结果。 注意:如果使用Zynq-7000或Zynq UltraScale+ MPSoC,通常需要包含FSBL(First Stage Bootloader)来引导应用程序。因此,在烧录QSPI Flash时,我们通常需要烧录一个BOOT.BIN文件,而不是单独的ELF文件。BOOT.BIN文件可以通过Create Boot Image工具生成。 生成BOOT.BIN文件的步骤: 1.Vitis中,选择菜单“Xilinx” -> “Create Boot Image”。 2. 添加FSBL的ELF文件,应用程序的ELF文件(以及如果有其他文件,如bitstream文件),并设置输出路径。 3. 点击“Create Image”生成BOOT.BIN。 然后在Program Flash中选择这个BOOT.BIN文件作为Image File。 如果遇到问题,比如无法识别JTAG设备,请确保: - 硬件连接正确,JTAG下载器(如Platform Cable USB II)已连接且驱动安装正确。 - 在Vivado Hardware Manager中能够正确识别到设备。 另外,如果使用命令行方式,可以使用以下命令(在XSCT中): ```tcl connect targets -set -filter {name =~ "ARM*#0"} # 选择目标设备 flash write_bank 0 <BOOT.BIN文件路径> 0 ``` 但是,在命令行中强制JTAG模式通常不需要特别设置,因为连接时已经指定了JTAG。在GUI中我们通过选项设置。 引用说明: - 关于Program Flash的使用,可以参考Xilinx文档:PG153(Vitis平台文档)[^1]。 - 关于创建启动镜像,可以参考Xilinx文档:UG1283(Zynq MPSoC软件开发者指南)[^2]。 相关问题: 1. 如何在Vitis中生成BOOT.BIN文件? 2. 如何通过命令行(XSCT)烧录QSPI Flash? 3. 在烧录QSPI Flash时遇到错误,如何解决? 4. 如何配置FSBL以支持QSPI Flash启动? 5. Vitis中Program Flash工具的高级选项有哪些?</think>### Vitis Vivado 2021.1 强制 JTAG 模式烧录 QSPI Flash 方法 在 Vitis 2021.1 中强制使用 JTAG 模式烧录 QSPI Flash,需通过 Xilinx Software Command-Line Tool (XSCT) 实现。以下是详细步骤: --- #### **步骤 1:准备启动镜像** 1. 生成 BOOT.BIN 文件-Vitis 中创建 Boot Image,包含 FSBL、比特流和应用 ELF 文件 - 输出路径示例:`C:/project/boot.bin` 2. 确认 QSPI Flash 参数: - 设备型号(如 `s25fl128s`) - 偏移地址(通常为 `0x0`) --- #### **步骤 2:通过 XSCT 执行强制烧录** 1. 打开 **XSCT 命令行**(Vitis → Xilinx → XSCT Console) 2. 依次执行以下命令: ```tcl # 连接 JTAG connect -url TCP:localhost:3121 # 选择目标设备(根据实际设备名修改) targets -set -filter {name =~ "ARM*#0"} # 设置 QSPI Flash 参数 flash write_bank 0 C:/project/boot.bin 0 -force -cable type xilinx_tcf url TCP:localhost:3121 ``` **关键参数说明**: - `-force`:强制覆盖 Flash 内容 - `-cable type xilinx_tcf`:指定 JTAG 连接协议 - `url TCP:localhost:3121`:JTAG 服务器地址(默认端口 3121--- #### **步骤 3:验证烧录结果** ```tcl # 读取 Flash 内容验证 flash read_bank 0 C:/dump.bin 0 0x100000 # 比较文件(使用外部工具) exec fc /b C:/project/boot.bin C:/dump.bin ``` --- #### **常见问题解决** 1. **JTAG 连接失败**: - 检查 Vivado Hardware Manager 是否占用 JTAG - 重启 hw_server:`hw_server -s TCP::3121` 2. **Flash 识别错误**: - 手动指定 Flash 型号: ```tcl targets -set -filter {name =~ "ARM*#0"} flash config -target 0 -flash s25fl128s ``` 3. **权限问题**: - 以管理员身份启动 Vitis - 关闭防火墙临时测试 > 注:强制烧录会擦除整个 Flash 扇区,确保关键数据已备份[^1]。 --- #### **脚本自动化示例** 创建 `flash_program.tcl` 脚本: ```tcl connect targets -set -filter {name =~ "ARM*#0"} flash write_bank 0 boot.bin 0 -force -cable type xilinx_tcf disconnect ``` 运行:`xsct flash_program.tcl` --- ### 相关问题 1. 如何为 Zynq UltraScale+ 生成多分区 QSPI 启动镜像? 2. XSCT 烧录 QSPI Flash 时出现校验错误如何解决? 3. 如何在 Vitis 中配置 QSPI Flash 的 Quad 模式? 4. JTAG 烧录后系统无法从 QSPI 启动的可能原因? 5. 如何通过 Vitis 调试器实时监控 QSPI 烧录过程? [^1]: Xilinx 文档 UG1137: "Embedded Design Tutorial" 第 6 章 Flash 编程部分。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值