赞
踩
最近学到了 内存池、IAP 相关的知识,虽然明白大致的过程,但是对于具体的很多数字还是有些似懂非懂,因此又回来稍微细致的总结一下,方便理解。
按照字节编址,也就是说,访问一个地址上存储的数据,得到的是一个字节的数据。
根据上述两条,可以得出结论:
上述存储地址被分为了8个块(目前我用到的芯片F1、F4、L4的都是,其他的没用过不确定)。
如下表所示:
存储块 | 功能 | 地址范围 |
---|---|---|
Block0 | Code(Flash) | 0x0000 0000 ~ 0X1FFF FFFF(512M) |
Block1 | SRAM | 0x2000 0000 ~ 0X3FFF FFFF(512M) |
Block2 | 片上外设 | 0x4000 0000 ~ 0X5FFF FFFF(512M) |
Block3 | FSMC BanK1&2 | 0x6000 0000 ~ 0X7FFF FFFF(512M) |
Block4 | FSMC BanK3&4 | 0x8000 0000 ~ 0X9FFF FFFF(512M) |
Block5 | FSMC寄存器 | 0xA000 0000 ~ 0XBFFF FFFF(512M) |
Block6 | 没用到 | 0xC000 0000 ~ 0XDFFF FFFF(512M) |
Block7 | Cotrx M3内部外设 | 0xE000 0000 ~ 0XFFFF FFFF(512M) |
比如,这里打开STM32L475的芯片手册上可以看到,从0X0000 0000 ~ 0XFFFF FFFF被分成了八份,也就是八个块。
不同芯片在整体的划分上都差不多,但是在实际的划分细节(大小)上会有差异。
简单说:
其中对于STM32而言,SRAM就是内存;Flash就是硬盘。
以最最最常见的STM32F103C8T6为例:
它有64K字节的Flash、20K字节的RAM。
使用CubeMX对该芯片创建一个工程,然后点击魔术棒可以看到:
0X0800 0000
,大小为0X10000
,也就是FLASH的大小为:0X10000个字节 = 65536个字节 = 64k个字节 = 64kBytes。0X2000 0000
,大小为0X5000
,也就是RAM的大小为:0X5000个字节 = 20480个字节 = 20k个字节 = 20kBytes。如果在KEIL软件中使用STLINK下载代码,就会发现代码是从0X0800 0000处开始保存的。
但是对于部分芯片来讲,其不止有一块RAM,比如STM32L475VET6,它有512K字节的Flash、128K字节的RAM。
同样的使用CubeMX对该芯片创建一个工程,然后点击魔术棒:
0X0800 0000
,大小为0X80000
,也就是FLASH的大小为:0X80000个字节 = 524288个字节 = 512k个字节 = 512kBytes。0X2000 0000
,大小为0X18000
;第二块起始地址为0X1000 000
,大小为0X8000
,也就是RAM的大小为:0X18000+0X8000个字节 = 0X20000个字节 = 131072个字节 = 128k个字节 = 128kBytes。了解这部分的内容主要是因为:在使用内存池的时候,要知道内存池到底是怎么划分的,可以划分几个内存池,每个内存池的大小最大可以划分多大,都要参考这部分的内容。
另外关注一下:地址0x1FFFF 0000到0x1FFF 7000这部分,这部分是系统存储器,不需要我们用户来操作,但是要知道这部分出厂的时候就已经存了有东西的,后面看到Bootloader的时候会说到。
使用 CubeMX 创建一个 stm32 工程,创建完成后什么也不写,直接使用 Keil 对编写的程序进行编译,编译完成之后,软件最下方会提示编写的程序所占空间的大小。
也可以在工程目录中保存编译结果的文件夹中找到.map
文件,在文件最下方查看更详细的信息。
数据类型解释:
再补充一个
上述四种类型的数据占用内存情况如下:
对应到具体的内存上,结合启动流程如下图所示。
结论,想要让一个程序正常运行。
上面分析了程序占用的 ROM 和 RAM 大小。然后分析一下数据或变量的存储位置。
图片来源:https://blog.csdn.net/wangguchao/article/details/119776738
程序编译后的内容包括:代码段(text)、数据段(data)、bss段、堆栈段(head stack) 。
其中:
来自嵌入式软件工程师试题答案。
有时间了来补个案例。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。