Mounriver Studio利用obj中编译文件分析RAM使用情况
在 MounRiver Studio(MRS)中,编译器生成的 .map 文件 (也称为链接映射文件)是一个重要的文本报告,它详细记录了程序在内存中的布局和分配情况。通过分析这个文件,我们可以深入了解和优化嵌入式项目的资源使用。
在沁恒的一些蓝牙芯片中,例如CH572、CH592这些小资源量芯片,开发时资源消耗量会很快,在后续优化内存分布时,map文件就可以派上用场:
①以BLE的Peripheral为例进行分析,如下图,RAM的基地址位于0x20000000:

一般在 GNU ld 链接器生成的 .map 文件里,有一个典型的层级结构:
- 段级(Section level):以
.highcode这样的段名开头,它的大小列就是整个段的总大小。 - 符号级(Symbol level):段下面缩进的每一行,是属于这个段的函数 / 变量,它们的大小是各自的占用字节数。
2910 .highcodelalign ... 0x0 ... // 段对齐占位
2915 .highcode ... 0x3bf4... // 段本身,总大小
2918 *(.highcode) ... ... // 通配符,匹配所有子段
2919 .highcode ... 0x4e ... // 属于该段的函数集合
2923 .highcode.RTC_GetCycle32k ... 0x18 ... // 具体函数大小
2926 .highcode.SetSysClock ... 0x1a4 ... // 具体函数大小
因此可以得出该程序中被函数定义所占用的RAM资源量=0x3BF4=15384字节;
②下图举例了一个子函数RTC_IRQHandler大小占用了0x16=22字节,如果将__HIGH_CODE修饰字删除,则RAM使用缩减22字节(当然,这只是举例,中断服务函数禁止去除__HIGH_CODE标识);

③ 废弃未使用的函数;如果发现一部分highcode修饰的函数,将highcode去掉后编译,结果编译大小未变化,则说明该函数被编译器列为不使用的废弃函数

④已使用的变量占用RAM,为0x4bc=1212字节:

⑤结合.lst文件分析:

分析如下:
| 段名 | Size (Hex) | Size (Bytes) | VMA (RAM 地址) | 用途 & 说明 |
| .highcode_init | 0x000001fc | 508 | 0x20000000 | 初始化代码段,属于 RAM 函数代码区,占用 508 字节 RAM |
| .highcode | 0x00003bf4 | 15348 | 0x200001fc | 核心 RAM 函数代码区,占用 15348 字节 RAM(约 15KB) |
| .data | 0x000004bc | 1212 | 0x20003df0 | 已初始化全局 / 静态变量,占用 1212 字节 RAM |
| .bss | 0x000002a0 | 672 | 0x200042b0 | 未初始化全局 / 静态变量,上电自动清 0,占用 672 字节 RAM |
| .stack | 0x00000000 | 0(仅占位) | 0x20020000 | 栈段,实际大小由链接脚本配置(表中 Size 为 0 是因为它是运行时分配) |

浙公网安备 33010602011771号