固件格式
BIN、Intel HEX 与 Motorola S-record 入门
比较原始二进制映像与两类带地址记录的文本格式,理解转换时需要核对的边界。
固件文件的后缀只能提供线索,不能独立说明数据应该写到哪里、目标器件如何接收它,或其中是否包含产品特定的头部。BIN、Intel HEX 和 Motorola S-record 的一个主要区别,是地址信息如何表达。
BIN:按字节保存的原始数据
BIN 通常是连续字节内容,没有通用的文本记录头来声明目标地址、器件型号或内存区域。转换工具可以把选定的程序段写成原始二进制数据;例如 GNU objcopy 对 binary 输出的说明是按所选内容生成内存转储,起点与输入段的装载地址有关。因此使用 BIN 时,必须从构建产物说明或目标编程工具确认地址、长度、空洞填充和数据排列规则。
Intel HEX:包含地址与记录类型的文本记录
Intel HEX 是 ASCII 文本记录格式。常见记录包含字节数、地址、记录类型、数据和校验字段;扩展地址记录可影响后续数据记录的绝对地址。解析器据此重建数据及地址范围。实际编程器是否接受某一变体、支持哪些记录类型,仍取决于该工具。
Motorola S-record:带地址的文本记录
S-record 由多种记录类型组成,记录中通常含长度、地址、数据和校验值;不同数据记录类型使用不同长度的地址字段,文件也可包含头部和结束记录。记录结构来自 Motorola/Freescale/NXP 工具文档,工具对记录类型的支持范围应单独确认。
转换时检查什么
- 数据区间的起止地址是否符合目标存储器布局。
- HEX 或 S-record 中的空洞如何处理:保留为空、按指定值填充,还是由工具跳过。
- BIN 的起始地址是否由单独参数提供,数据长度是否落在允许区域内。
- 转换前后字节顺序、校验结果和构建版本是否一致。
- 编程器是否明确支持该格式及其记录类型。
地址记录型格式不自动等于完整的、可直接启动的固件包;原始 BIN 也不意味着数据一定从地址零开始。准备通过 JTAG 写入时,可按 JTAG 固件编程流程 先核实映像再选编程路径。
参考资料
- GNU Binutils
objcopy输出格式说明 - Keil Intel HEX 文件格式说明
- NXP M68HC12A4EVB 用户手册:S-record 格式