如何查找MPLAB生成的boot.bin与program.bin偏移地址
ATSAMD20E15 MPLAB环境下boot.bin与program.bin偏移地址查找方法
纯二进制格式(.bin)本身不存储链接地址信息,两个镜像的烧录偏移都是项目编译链接阶段就确定的,不需要解析bin文件内容,直接通过以下三种方式就能查到准确值,ATSAMD20E15的Flash物理基址固定为0x00000000,以下提到的偏移均为相对于该基址的绝对偏移值:
从链接脚本(.ld文件)查询(最准确)
打开对应MPLAB项目的根目录,找到链接阶段使用的.ld后缀文件:- boot项目的ld文件中,找到
MEMORY块下FLASH区域定义的ORIGIN字段值,就是boot.bin的烧录偏移,绝大多数bootloader的偏移都是0x00000000;同区域的LENGTH字段是boot占用的Flash大小,boot的结束地址为ORIGIN + LENGTH,这个地址就是program.bin的起始偏移边界。 - program项目的ld文件中,同样找
MEMORY块下FLASH区域的ORIGIN字段值,就是program.bin的烧录偏移,正常情况下这个值和前面算出来的boot结束地址是按Flash页(SAMD20E15页大小为64字节)对齐的,不会出现地址重叠。
- boot项目的ld文件中,找到
从编译输出的map文件查询(最直观)
项目全量编译完成后,在MPLAB项目的输出目录(默认是dist/[配置名]/production/下)找到和项目同名的.map后缀文件,用任意文本编辑器打开:- boot项目的map文件中搜索
Memory Configuration段落,该段落下flash行标注的起始地址就是boot.bin的偏移;再搜索_etext符号,该符号对应的地址就是boot代码段的结束地址,也就是program.bin的偏移起始边界。 - program项目的map文件中,同样在
Memory Configuration段落找flash行的起始地址,就是program.bin的烧录偏移。
- boot项目的map文件中搜索
从MPLAB X IDE项目属性快速查询
不想翻本地文件的话可以直接在IDE里看:
右键点击对应项目,选择「属性」,在配置列表中找到链接器分类(如果你用的是XC32编译器,对应分类名是xc32-ld),查看内存配置相关的选项页,里面会直接展示当前配置下Flash区域的起始地址,也就是对应bin文件的烧录偏移。如果你在项目配置里开启了bootloader关联选项,还会直接显示program相对于boot的偏移量。
初学者注意:不要把RAM地址和Flash地址搞混,ATSAMD20E15的RAM基址是
0x20000000,和Flash地址段完全独立,地址最高位不同可以直接区分;用烧录工具填偏移时注意单位是字节,不要误填为半字/字单位导致烧录地址错位。
内容的提问来源于stack exchange,提问作者SSR
相关产品推荐
相关产品推荐

