核心内容摘要
绯红的挽歌:当“被采摘污染的茜草OVA”突破虚实之界,一场席卷全球的生态危机正在上演
为什么需要合并HEX文件在嵌入式开发中我们经常会遇到需要将多个HEX文件合并成一个文件的情况。
最常见的就是Bootloader和应用程序的合并。
Bootloader负责系统启动和固件升级而应用程序则是实现具体功能的代码。
这两个部分通常是独立开发的最终需要合并成一个完整的固件烧录到芯片中。
我刚开始做嵌入式开发时每次调试Bootloader和APP都要分别烧录特别麻烦。
后来发现可以通过工具自动合并效率提升了好几倍。
合并后的HEX文件可以直接用于生产烧录避免了人工操作的繁琐和出错风险。
HEX文件合并的核心在于地址管理。
Bootloader通常放在Flash的起始地址比如0x08000000而APP则放在后面的地址空间比如0x08008000。
合并时需要确保两个程序的地址空间不重叠否则会导致程序运行异常。
KEIL环境下的HEX合并方案
1 使用srec_cat工具KEIL官方推荐使用srec_cat工具来合并HEX文件。
这个工具功能强大可以处理各种地址偏移和裁剪需求。
我第一次用的时候被它的参数搞晕了后来发现其实掌握几个关键参数就够用了。
安装srec_cat很简单从SourceForge下载Windows版本即可。
使用时最基本的命令格式是这样的srec_cat.exe Bootloader.hex -Intel Application.hex -Intel -o Combined.hex -Intel这个命令会把两个HEX文件简单拼接。
但实际项目中我们通常需要更精细的控制比如设置地址偏移srec_cat.exe Bootloader.hex -Intel -crop 0x000000 0x007FFF Application.hex -Intel -crop 0x000000 0x007FFF -offset 0x008000 -o Combined.hex -Intel这里-crop参数限定了只取特定地址范围的内容-offset则设置了地址偏移。
我建议把这些命令写成批处理文件方便重复使用。
2 配置KEIL自动合并更高效的做法是让KEIL在编译完成后自动执行合并操作。
在Options for Target - User选项卡中可以在After Build/Rebuild里添加srec_cat命令。
我通常会在项目目录下创建一个merge.cmd文件内容如下# 禁止地址顺序警告 -disable-sequence-warning # 处理Bootloader .\Output\Bootloader.hex -Intel -crop 0x08000000 0x08007FFF # 处理APP并设置偏移 .\Output\Application.hex -Intel -crop 0x08000000 0x08007FFF -offset 0x08008000 # 设置输出块大小 -Output_Block_Size16 # 输出文件 -o .\Output\Combined.hex -Intel然后在KEIL的After Build里调用srec_cat.exe merge.cmd这样每次编译完成后就会自动生成合并后的HEX文件特别适合持续集成环境。
3.
常见问题与解决方案
1 地址冲突处理合并HEX文件最常见的坑就是地址冲突。
有一次我合并后的程序总是跑飞调试了半天才发现是APP的地址没设置对和Bootloader重叠了。
在KEIL中APP工程的地址设置有两个地方要注意Target选项卡中的IROM1地址要设置为APP的起始地址分散加载文件scatter file也要相应调整建议在合并前先用HEX文件查看工具检查两个文件的地址范围确保没有重叠。
2 中断向量表重映射Bootloader和APP都有中断向量表需要特别注意处理。
通常的做法是Bootloader中使用标准的中断向量表APP中将中断向量表重映射到自己的地址空间在跳转到APP前重新配置中断向量表偏移寄存器如STM32的VTOR我曾经遇到过中断不触发的问题就是因为忘记在APP中设置VTOR寄存器。
正确的做法是在APP的启动文件中添加SCB-VTOR FLASH_BASE | 0x08008000;
3 填充未使用区域Flash中未被使用的区域最好填充为0xFF这是Flash的擦除状态。
srec_cat可以用-fill参数实现-fill 0xFF 0x08000000 0x0800FFFF这个命令会把指定地址范围填充为0xFF。
我建议在合并时都加上这个参数可以避免一些奇怪的运行时问题。
其他实用技巧
1 使用J-Flash合并除了srec_catJ-Flash也是个不错的图形化工具。
具体步骤打开第一个HEX文件点击File - Merge Data File添加第二个HEX文件保存合并后的文件我有时会用J-Flash来验证合并结果它的地址冲突检查很直观。
不过对于自动化流程还是srec_cat更合适。
2 HEX与BIN转换有些场景需要先将HEX转为BIN合并后再转回HEX。
可以用以下工具链hex2bin转换HEX到BIN用copy /b命令合并BIN文件bin2hex转换回HEX虽然多了一步但有时更灵活。
我在处理一些特殊格式的固件时用过这个方法。
3 校验合并结果合并完成后一定要校验我常用的方法用HEX查看工具检查关键地址的内容计算校验和实际烧录测试有一次生产线上出现批量问题就是因为合并脚本有个参数写错了导致部分代码被截断。
现在我都会在脚本中加入校验步骤。
实际项目经验分享去年做一个物联网项目时我们需要支持远程升级。
Bootloader有20KBAPP有200KB。
刚开始手动合并经常出错后来我写了个自动化脚本主要解决了以下问题自动检测文件大小确保不会超出Flash容量计算并填充空白区域生成带版本信息的合并文件集成到Jenkins实现持续集成这个脚本大大提高了发布效率也减少了人为错误。
关键部分是这样的# 检查文件大小 boot_size$(stat -c%s Bootloader.hex) app_size$(stat -c%s Application.hex) total_size$((boot_size app_size)) if [ $total_size -gt 229376 ]; then echo 错误文件大小超过224KB限制 exit 1 fi # 执行合并 srec_cat Bootloader.hex -Intel -crop 0x08000000 0x08004FFF \ Application.hex -Intel -crop 0x08000000 0x08033FFF -offset 0x08005000 \ -fill 0xFF 0x08000000 0x08037FFF \ -o Combined.hex -Intel在嵌入式开发中HEX文件合并是个很实用的技能。
掌握好这个技术可以让你在Bootloader开发、固件升级等场景下游刃有余。
刚开始可能会遇到各种问题但只要理解了原理加上合适的工具就能轻松应对。