Green Hills中文网站 > 使用教程 > Green Hills怎么生成map文件 Green Hills map文件如何查看内存分布
教程中心分类
Green Hills怎么生成map文件 Green Hills map文件如何查看内存分布
发布时间:2026/10/21 13:49:10

  工程新增一块缓冲区后,链接提示RAM空间不足,但源文件只多了几行,这时可以从map文件查起。它记录了链接后的段地址、大小及符号等信息,能帮助定位空间分配到了哪里。查看时要把内存区域、段和具体对象分开理解,也要区分链接时预留的空间与程序运行中的实际使用量。

  一、Green Hills怎么生成map文件

 

  map文件由链接阶段产生。只编译单个源文件、没有执行最终链接时,不会得到这次修改对应的新map结果。

 

  1、打开map输出选项

 

  ①在MULTI Builder中选中生成可执行文件的工程节点,打开构建选项,进入【Linker】→【Linker Output Analysis】。

 

  ②找到【Map File Generation】,选择【Generate Default Map File】,保存设置。

 

  这一选项对应-map。若项目使用脚本构建,也可以在最终链接命令中加入该参数。应检查实际执行的链接命令,避免选项只加到了某个源文件的编译设置中。

 

  2、指定便于查找的文件名

 

  ①在【Map File Generation】中选择【Generate User-Specified Map File】,填写输出文件名,例如app.map。

 

  ②如果直接维护构建命令,使用-map=app.map指定文件,再检查输出路径是否可写。

 

  相对路径会受到构建工作目录影响。多套配置共用一个文件名时,还可能互相覆盖,调试版和发布版宜分别指定保存位置。

 

  3、重新链接并确认文件更新

 

  ①保存构建选项,重新构建目标工程,确认日志中确实执行了链接。

 

  ②在输出位置找到.map文件,检查修改时间,并与本次生成的可执行文件核对。

 

  ③用文本编辑器打开文件,查看文件头中的链接时间、工具版本和目标信息,确认没有拿到旧文件。

 

  4、链接失败时保留map

 

  ①在【Map File Retention】中选择【On】,或在链接命令加入-keepmap,再次构建问题工程。

 

  链接出错时,保留下来的map可以辅助排查,但其中的布局可能不完整。内存越界、未解析符号等问题修复后,还应以成功链接生成的结果为准。

 

  二、Green Hills map文件如何查看内存分布

 

  打开文件后,可以先找段汇总,再结合链接文件判断这些地址属于哪块Flash或RAM。不同目标平台的段名会有差别,地址范围比名称更可靠。

 

  1、核对内存区域的起点和容量

 

  ①打开工程实际使用的链接指令文件,在MEMORY定义中记录各区域的ORIGIN和LENGTH。

 

  ②回到map的段汇总,例如Image Summary,查看【Base】和【Size(hex)】,判断各段落在哪个区域。

 

  ③将段的起始地址加上长度,核对是否越过所属区域边界,并检查段之间是否有空隙。

 

  例如某段从0x20002000开始,长度为0x1800字节,最后一个字节位于0x200037FF。区域总空闲量和连续可用空间并不是一回事,固定地址、对齐要求及预留区都可能影响后续放置。

  2、区分代码、数据和预留空间

 

  ①在段汇总中查找.text、.rodata,读取【Base】和【Size(dec)】,核对代码、只读数据实际放在Flash还是RAM。

 

  ②查找.data、.bss,以及工程中使用的.sdata、.sbss等段,记录它们的地址和大小。

 

  ③如果存在.ROM.data等初始化镜像段,结合链接文件确认它与RAM中.data的对应关系。

 

  ④查找.stack、.heap或项目自行命名的预留段,检查它们是否已经计入相应RAM区域。

 

  有初值的可写数据可能既需要Flash保存初始内容,也需要RAM提供运行空间;.bss则用于零初始化数据,不能按段大小直接认定它占用了同样多的Flash。代码也可能被配置为复制到RAM运行,应按加载和运行位置分别统计。

 

  3、从大段继续查具体对象

 

  ①某个段明显偏大时,在map中继续查找其目标文件、库成员及符号条目,定位贡献较大的模块。

 

  ②在【Map File Sorting】选择【Numeric】,重新链接后按地址顺序查看符号分布;脚本构建可使用-Mn。

 

  如果符号条目提供尺寸,可以据此进一步定位大数组或函数。若只列地址,不宜直接把相邻地址之差当成对象大小,其中可能存在对齐填充、别名或其他链接处理。

 

  三、Green Hills map文件怎样用于内存排查

 

  一份map能说明当前布局,两份条件一致的map更方便找出变化。排查时还要留意,文件中的“预留了多少”不能代替运行测试中的“实际用了多少”。

 

  1、比较修改前后的空间变化

 

  ①保留修改前后的map,核对构建配置、优化级别、工具链和链接文件是否一致。

 

  ②先比较段汇总的【Size(dec)】,找出增长较大的段,再追查对应目标文件与库成员。

 

  ③若段大小变化不大、地址却整体后移,结合【Base】和链接文件检查对齐、固定地址及新增预留区。

 

  例如.bss增长,可以沿新增全局数组或静态缓冲区查找;代码段增长,则可能与新模块、库函数或优化设置有关。比较时一次控制较少的变量,才能判断变化来自哪里。

 

  2、补查运行中的堆栈使用

 

  ①根据map和链接文件核对栈、堆的预留容量,确认任务栈是否另有独立分配方式。

 

  ②在目标板运行主要业务和异常处理路径,通过调试器、系统提供的栈统计或堆分配记录观察使用情况。

 

  map中的.stack大小通常表示配置的空间,不是已经测得的调用栈峰值。中断嵌套、任务并发和动态分配都会影响运行结果,不能仅凭链接成功就判断内存余量足够。

  总结

 

  Green Hills的map文件适合回答“哪一段放在哪里、空间被哪些对象占用”这类问题。把段地址与链接文件对应起来,比单看可执行文件大小更容易解释Flash和RAM的分布。工程持续迭代时,保留几个关键版本的map,也能看出缓冲区、库代码或预留空间的变化。涉及堆栈容量时,还应结合目标板上的运行记录判断。希望这些方法能帮助大家读懂链接结果,查找内存增长和区域越界的原因。如果有相关需求,欢迎联系咨询。

176 5129 0128