工程增加几个缓冲区后,RAM统计突然上涨,或者变量大小没变,剩余空间却少了一截,这时就需要查看链接映射文件。TASKING的映射文件能说明各个段来自哪个模块、放到了哪里,以及哪些空间被预留。核对时不能只盯着汇总数字,还要区分数据占用、保留空间和实际放置结果。以下以TASKING TriCore的Eclipse集成环境为例。
一、Tasking如何生成并检查链接映射文件
文本映射文件适合搜索和版本对照,XML映射文件适合在图形查看器中展开检查。两种文件都应与本轮构建产物对应。
1、启用映射文件输出
①选中目标工程,打开【Project】→【Properties】,展开【C/C++Build】,选择【Settings】。
②在【Tool Settings】中进入【Linker】→【Map File】,启用【Generate XML map file format(.mapxml)】和【Generate map file(.map)】。
③按需启用内存使用、链接结果和定位结果等输出内容,保存设置并重新构建工程。
④打开当前构建配置的输出目录,核对【.map】、【.mapxml】和【可执行文件】的生成时间。
若文件里没有内存统计,检查链接参数是否通过map-file-format关闭了相应内容。构建未完成时,也要防止把输出目录中的旧文件当成本轮结果。
2、从汇总进入具体段明细
汇总用于确定哪个存储区域发生变化,定位结果用于查找具体占用。只看整个工程的数据合计,容易把Flash中的初始化内容也算进RAM。
①双击【.mapxml】,通过页面下拉框或【Outline】进入【Used Resources】,查看目标RAM区域。
②切换到【Locate Result】,右键选择【Configure Columns】,显示【Section】、【Group】、【Defined in】及段大小、地址等列。
③找到可疑段后,在【Link Result】中核对输入模块;需要追查库文件来源时,查看【Processed Files】。
二、Tasking映射文件中RAM占用异常如何核验
可以先比较异常区域的Code、Data和Reserved分别增加了多少。数据变大与预留空间变大,应沿不同方向检查。
1、核对统计对象和容量口径
①在【Used Resources】中记录目标RAM的【Code】、【Data】、【Reserved】、【Free】和【Total】。
②打开当前使用的【.lsl文件】,核对芯片型号、目标内存名称及容量定义。
③对照【Tool and Invocation】,检查工具版本、链接选项和本轮使用的配置。
同一张表中可能包含Flash和多个RAM区域,整表Total不能直接作为RAM占用。地址空间统计还可能涉及重叠映射,也不宜与物理内存统计混加。应固定一个区域、同一种口径进行比较。
2、检查新增数据及RAM中的代码
缓冲区、全局数组和静态对象会增加数据空间;安排到RAM执行的函数也会消耗RAM,但通常计入Code列。
①在【Locate Result】中按【Chip name】限定目标RAM,查看新增或变大的【数据段】和【代码段】。
②根据【Defined in】找到对应模块,检查源代码中的【数组长度】、【对象类型】及相关【宏定义】。
③对照初始化数据的【RAM段】和带方括号的【ROM副本段】,分别记录其存储区域。
初始化数据需要在RAM中保留运行空间,同时可能在Flash保存初值。两条记录用途不同,不能因为名称接近就把它们都累计为RAM数据。
3、展开预留空间和对齐空隙
①对照【.lsl文件】中的【stack】、【heap】、【reserved】及CSA相关定义,检查大小是否变化。
②在【Locate Result】中启用【Show Gaps】,核对段之间的空隙和对齐要求。
③查找【.alignment_protection】及固定大小输出段,对照所属【group】的布局设置。
Reserved增加不一定来自业务变量。栈、CSA、显式预留和对齐保护都可能影响这一列。部分版本还存在未清零段被计入Reserved的情况,遇到分类疑问时,应结合对应工具版本和段明细判断。
三、Tasking怎样定位异常放置并复核修改结果
发现增长来源后,还要检查段是否进入了预期内存。某块RAM变满,也可能是布局选择变化,未必是整个工程的数据量增加。
1、检查段是否被预期分组选中
①在【Locate Result】中找到目标段,查看【Group】和【Address space】。
②打开对应【.lsl文件】,核对【section_layout】、【select】及【run_addr】设置。
③修正后重新链接,检查目标段的【Group】、内存名称和地址。
分组有名称时,映射文件更方便核验。TriCore中近地址段与普通线性地址段所属空间不同,选择表达式写对了,放在不匹配的布局空间下,仍可能选不中。
2、比较前后版本的具体变化
不能只比较两份报告的百分比。芯片配置或内存容量变了,即使段大小没变,占用比例也可能不同。
①打开前后两份【.map文件】,核对【工具版本】、【链接选项】及目标内存容量。
②按【段名称】和【来源模块】对照大小、所属分组及放置区域,分别记录新增、增大和迁移的段。
3、核对剩余空间能否满足放置要求
①在【Used Resources】中查看【Free】及适用的【Largest gap】信息。
②在【Locate Result】中检查目标区域的【空隙】和段边界,对照【Locate Rules】中的地址限制。
剩余总量足够,也可能没有符合要求的连续空间。固定地址、对齐和连续分组都会限制放置,不能为了让链接通过就直接取消约束,应核对这些约束对应的硬件或接口要求。
4、区分静态分配与运行时使用
①在【Used Resources】中记录栈、堆等空间的分配情况,核对【栈使用估算】和相关告警。
②使用项目已有的【调试配置】运行代表性场景,检查任务栈、动态分配及异常记录。
③保存本轮【映射文件】、【.lsl文件】和【代码版本】,附上修改原因。
映射文件反映链接阶段的空间安排,不能直接说明运行时堆分配或栈峰值。减小预留容量后,即使统计下降,也仍需完成相应运行验证。
总结
链接映射文件适合把RAM变化落实到具体段、模块和布局规则。日常保留一份稳定版本的报告,后续增加功能时,就能看清空间花在了哪里。对于预留区域和运行时资源,也应留下设置依据,避免只凭剩余数字调整容量。希望这些方法能帮助大家核清内存占用,如有相关需求,欢迎沟通咨询。