1

ARM微控制器的“正常”ARM交叉编译通常包括三个或四个步骤:

  1. 使用汇编器将启动代码(如果是汇编)汇编到目标文件中
  2. 使用编译器将任何源代码编译成目标文件
  3. 使用链接器将目标文件链接到 .elf 文件中
  4. 使用 objcopy 将 .elf 文件转换为 .hex 文件
  5. 刷新 .hex 文件

这是我不确定的第 4 步。在 OpenOCDflash write_image命令的文档中,它指出:

文件 [type] 可以明确指定为 bin(二进制)、ihex(Intel hex)、elf(ELF 文件)、s19(摩托罗拉 s19)。内存或生成器。

很明显 OpenOCD 支持 elf 文件,但我不知道这究竟意味着什么。这仅在某些目标上支持吗?JTAG/SWD 适配器是否必须提供某种类似 objcopy 的功能才能正常工作?它只是从 OpenOCD 还不支持 elf 文件的时代开始的遗留物吗?

4

1 回答 1

3

包含地址和数据的文件格式,如 elf、ihex、srec 很好用,我主要使用 elf。.bin 文件不携带地址,因此您 1) 必须指定起始地址 2) objcopy 填充定义区域之间的间隙,这可能会产生问题并需要更多的加载时间等。

使用 .bin 会在地址上留下人为错误的空间。不幸的是,我遇到过 .elf 和 openocd 的组合会加载错误地址或至少在加载时打印错误地址的情况。

我尽可能使用 .elf 文件。如果实用程序不支持 elf 但支持 ihex 或 srec,则为 .hex 或 .srec。和 .bin 例如在使用 x/y/zmodem 加载程序时。

我会假设 openocd 是分层的,有一个读取文件的前端,当它到达后端时,jtag 或后端不知道数据来自哪种文件。我不知道事实,但假设...

于 2012-12-01T16:59:31.633 回答