无法刷写 ARM 设备 - “英特尔 Hex 文件不以 ':' 开头”
Posted
技术标签:
【中文标题】无法刷写 ARM 设备 - “英特尔 Hex 文件不以 \':\' 开头”【英文标题】:Cannot flash ARM device - "The Intel Hex file does not start with ':'"无法刷写 ARM 设备 - “英特尔 Hex 文件不以 ':' 开头” 【发布时间】:2018-06-13 18:08:15 【问题描述】:我有一个与 arm-none-eabi-gcc 配合使用的代码库。我想在添加 C++ 时将大部分源文件保留在 C 中。我在编译时遇到了一些问题,但最终似乎为我的设备 (Atmel ATSAMG55) 成功编译。
但是,当我在 Atmel studio 中刷机时,出现错误
The Intel Hex file does not start with ':'
注意,我只是通过 Atmel ICE 编程器/调试器和 Atmel 工作室对其进行编程。我正在通过 arm-none-eabi-gcc 和 arm-none-eabi-g++ 以及一个自定义的 make 文件进行编译。
我打开了我的 .hex 输出的十六进制查看器,发现大部分是 0x00000000,但在开头和结尾找到了一些“真实”数据。图片如下。
显然,如果编译过程正确发生,它不会大部分是 0x00000000。但是,如果没有任何编译器错误,我有点不知道从哪里开始。下面是我的 make 文件的“核心”的摘录。
all: $(TARGET)
# Create binary from object files and external libraries
$(TARGET): $(OBJECTS_C) $(OBJECTS_CXX) $(S_SRCS)
@mkdir -p $(dir $@)
$(CXX) $(CXXFLAGS) $(C_INC) -T$(LDFILE) $(LFLAGS) -o $@
$(TOOLCHAIN)-objcopy -O binary $@ $(basename $@).bin
out/$(PLATFORM_MCU)/obj/%.o: %.cpp
@mkdir -p $(dir $@)
$(CXX) $(CXXFLAGS) $(C_INC) -o $@ -c $<
-include $(DEP_CXX)
out/$(PLATFORM_MCU)/obj/%.o: %.c
@mkdir -p $(dir $@)
$(CC) $(CFLAGS) $(C_INC) -o $@ -c $<
-include $(DEP_C)
.PRECIOUS: $(PRECIOUS)
.PHONY: all clean
clean:
rm -rf $(CLEAN)
上面的大部分内容是变量定义和设置标志。我对此比较有信心,因为这在纯 C 中运行良好。只有当我添加第二组对象/源依赖项时,我才开始遇到问题。
有没有人看到过这样的编译问题并且对从哪里开始调试有任何意见?谢谢!
【问题讨论】:
【参考方案1】: 根据您收到的错误消息,您的编程工具需要一个 Intel Hex 格式的文件。 您提供十六进制转储的文件不能是 Intel Hex 格式的文件,因为这种格式使用 ASCII 编码。您提供的屏幕截图是 ELF 格式的文件: 第一个字节是:
00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............|
您的 make 文件似乎正在生成一个二进制文件,而您需要一个 Intel Hex 格式的文件:
$(TOOLCHAIN)-objcopy -O 二进制 $@ $(basename $@).bin
因此,您可能需要在上面一行之后添加以下行:
$(TOOLCHAIN)-objcopy -O ihex $@ $(basename $@).ihex
生成的文件 (.ihex) 应该是与您的编程工具一起使用的文件。
【讨论】:
嗨@Frant,非常感谢您的回复。你的观点很棒。 “二进制”的提及来自遗留代码,我真的不确定其意义。但是,我尝试了您的更改,但没有成功。注意,我的 $(TARGET) 类似于 /mcu/obj/firmware.elf。从历史上看,使用 gcc,它一直按原样工作,我最终得到了 .bin 和 .elf 文件。因为它与纯 gcc 一起工作,所以我真的担心我在定义 %.o: %.c 和 %.o: %.cpp 的两个部分中做错了什么。 它是如何不完全工作的?你得到一个 .ihex 文件了吗?您是否从您的编程软件中收到了不同的错误信息?闪现的内容和预想的不一样?还有其他提示吗? 它确实生成了一个 .ihex 文件,以及目标 .elf 文件。尝试通过 atmel studio 和 Atmel ICE 编程器/调试器刷新 iHex 文件时,错误是“文件内容未映射到任何有效的设备存储器以对闪存进行编程”。我知道它说它需要一个 iHex,但过去我已经成功地使用 c 或 c++ 刷新了 .elf、.bin 和 .bin。这感觉像是链接文件的问题,因为输出中的数据非常稀疏。您认为这与尝试在一个 makefile 中使用 gcc 和 g++ 有关吗? 哦,我忘了补充,是的 iHex 文件的内容不同。这次都是10个字节,真的不知道是什么意思。【参考方案2】:看起来问题源于不正确的标志。我知道之前我提到过假设标志是正确的可能是公平的。我不再认为那是真的。在更改标志(并更新一些硬件特定文件以识别硬浮动 abi)之后,它似乎正在工作。感谢所有帮助过我的人。
【讨论】:
以上是关于无法刷写 ARM 设备 - “英特尔 Hex 文件不以 ':' 开头”的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 Apple Silicon 上的 iOS 模拟器 lipo arm64 .a 设备文件
如何使用 Odin 解压、修改、打包和刷写 `system.img.ext4` 文件?