通过Keil如何查看MCU的RAM与ROM使用情况

本文介绍如何在Keil开发环境中通过Map文件检查和分析项目的内存使用情况,包括RAM和ROM的分配详情,帮助开发者优化代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

        在很多偏门MCU,还是使用keil进行开发,开发过程中能免会出现ram,rom不够问题,怎么查看呢?下面揭晓答案^_^。

一、查看方式

1)、编译后

2)、通过map查看

方法很简单,鼠标对准红色圈,双击即可。


有时,双击不了,只要按照上图配置,此 .map文件一定会在本工程里面,如下所示:

 找到.map,拖拽到keil中打开,即可。通过此文件可以分析,对应各个部分使用情况与合理性,从而进行做相应的优化处理。

 Keil 生成的 Map 文件里面内容大致分为五大类(按照.map文件分类的顺序)如下所示:

1.Section Cross References

指的是各个源文件生成的模块、段(定义的入口)之间相互引用的关系,配置中需勾选上:Cross Reference,例如:

startup_stm32f401xe.o(RESET) refers to stm32f4xx_it.o(i.NMI_Handler) for NMI_Handler

上面表示 startup_stm32f401xe.o 文件中的 main 函数调用了 stm32f4xx_it文件中的 NMI_Handler函数

2.Removing Unused input sections from the image

移除未使用的模块,配置中需勾选上:Unused Sections Info,就是删除工程代码中,没有被调用的模块。最后面还有个统计信息,例如

表明有294段没用使用,总的占17904字节

3.Image Symbol Table

映射符号表,配置中需勾选上:Symbols,从中可以看出符号名称,存储地址,存储大小,所在的目标文件

 举例:可以看出,footwear_title_lists_cn,在main.c文件中,占用了52个字节,如果RAM满了,可以做相对应的优化,如下所示:
 

4.Memory Map of the image

内存映射分布,配置中需勾选上:Memory Map

Image Entry point : 0x08000195:指程序入口地址。

Load Region LR_IROM1 (Base: 0x08000000, Size: 0x000021f8, Max: 0x00080000, ABSOLUTE):
指加载区域 LR_IROM1 起始地址为 0x08000000,大小有0x000021f8,这块区域最大为0x00080000.

Execution Region ER_IROM1 (Exec base: 0x08000000, Load base: 0x08000000, Size: 0x000021d0, Max: 0x00080000, ABSOLUTE):
指可执行区域 ROM_VECTOR 起始地址为 0x08000000,大小有0x000021d0,这块区域最大为0x00080000.

5.Image component sizes

存储组成大小配置中需勾选上:Size Info,其实主要就是对模块进行汇总存储大小信息

Code:指代码的大小;

RO-data:指除了内联数据(inline data)之外的常量数据;

RW-data:指可读写(RW)、已初始化的变量数据;

ZI-data:指未初始化(ZI)的变量数据;

Code、RO-data:位于FLASH中;

RW-data、ZI-data:位于RAM中;

提醒:RW-data已初始化的数据会存储在Flash中,上电会从FLASH搬移至RAM中。

关系如下:

RO Size = Code + RO Data

RW Size = RW Data + ZI Data

ROM Size = Code + RO Data + RW Data

现在已经弄明白Map文件的内容,可以做以下分析。

(1)函数和变量所在的地址,这在推导函数调用栈时非常有用

(2)根据Code RO data RW data 的组成部分,可针对性的优化ROM空间和RAM空间

二、总结

       详细了解,也可以阅读我之前写的文章,链接,时间久了都忘差不多了,好在做了笔录,方便以后翻阅。
 

<think>嗯,用户想了解Keil链接脚本中RAM配置的示例和指南。首先,我需要回忆一下Keil的链接器脚本(scatter file)的结构和语法。Keil使用scatter文件来定义内存布局,包括ROMRAM的分配。用户可能正在开发嵌入式系统,需要精确控制代码和数据在内存中的位置,尤其是在资源受限的微控制器上。 首先,我应该解释scatter文件的基本结构,比如定义加载区域和执行区域。RAM配置主要涉及执行区域,因为代码在运行时可能从ROM复制到RAM执行,尤其是初始化数据段。例如,RW_IRAM1通常用于指定RAM的起始地址和大小。 接下来,提供一个示例很重要。用户可能需要一个具体的例子来参考,比如针对STM32F4的配置,其中包含RAM的起始地址0x20000000和大小128KB。示例中的执行区域应该包括堆栈、数据段、BSS段以及可能需要的其他内存区域,比如CCMRAM。 然后,需要详细说明各个部分的作用。比如,STACK和HEAP部分的大小设置,如何定义.data和.bss段,以及使用+0确保连续分配。还可能提到特定于硬件的部分,如CCMRAM,这取决于目标MCU是否有特殊的内存区域。 此外,用户可能需要知道如何验证配置,比如通过生成的map文件检查地址分配是否正确。还需要提醒常见问题,比如内存溢出或对齐错误,以及如何调整堆栈大小或优化内存使用。 最后,生成相关问题可以帮助用户进一步探索相关主题,比如分散加载文件的调试方法、多区域RAM配置或启动文件的配合。确保引用部分正确,可能参考Keil的官方文档或特定微控制器的内存布局说明。</think># Keil链接脚本RAM配置指南 ## 一、基础语法结构 Keil的分散加载文件(scatter file)采用以下结构定义内存区域: $$ LR_IROM1 0x08000000 0x00100000 { ; 加载区域 ER_IROM1 0x08000000 0x00100000 { ; 执行区域 *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x20000000 0x00020000 { ; RAM配置 .ANY (+RW +ZI) } } $$ 其中$0x20000000$是STM32系列典型的RAM起始地址,$0x00020000$对应128KB RAM空间[^1]。 ## 二、完整配置示例 ```scatter LR_IROM1 0x08000000 0x00080000 { ER_IROM1 0x08000000 0x00080000 { *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x20000000 0x00020000 { *(.stack) *(.heap) .ANY (+RW +ZI) } RW_IRAM2 0x10000000 0x00010000 { *(.ccmram) } } ``` ## 三、关键配置说明 1. **堆栈配置** ```scatter *(.stack) 0x20000000 UNINIT { startup_stm32f4xx.o (Stack) } ``` 通过$UNINIT$属性避免初始化操作,$Stack_Size = 0x400$定义堆栈大小 2. **数据段配置** ```scatter .data 0x20000400 { ; 数据起始地址 *(.data) *(.data*) } > RW_IRAM1 ``` 使用$+0$偏移确保连续分配: ```scatter .bss +0 { *(.bss) *(COMMON) } ``` ## 四、验证方法 1. 编译后查看生成的.map文件 2. 确认各段地址RAM范围内 3. 使用$__initial_sp$检查堆栈指针初始值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ch_champion

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值