Block 0 代表Flash,Block1代表SRAM
FLASH内存分布
Flash memory
Executable Code | 可执行代码 |
---|
Literal Values | 常量,是用enum类型和#define宏 | Read Only Data | 只读的变量,const修饰的全局变量 | Copy of Data Section | 非0的全局变量 |
SRAM内存分布
data | 非0的全局变量 |
---|
bss | 未初始化或初始化为0的全局变量,由static修饰的为0的全局变量或局部变量,区别在于作用域不同 | Stack | 局部变量,const修饰的局部变量 | Heap | malloc动态申请的内存 |
程序运行过程
运行时内存呢分布,RO段与RW段中间的空白可以看成Flash与SRAM之间的区域。 也可以说ROM与RAM之间的内存区域。
STM32 在上电启动之后默认从 Flash 启动 启动之后会将 RW 段中的 RW-data(初始化的全局变量)搬运到 RAM 中 但不会搬运 RO 段
即 CPU 的执行代码从 Flash 中读取(CPU读Flash的速度也很快) 另外根据编译器给出的 ZI 地址和大小分配出 ZI 段,并将这块 RAM 区域清零。
拓展
auto :用于区分局部变量和全局变量. 用auto定义的变量都是局部变量 volatile :读取该变量的值都重新从内存中读取 register :变量存在CPU 内部寄存器中而不是通过内存寻址访问
整理
存储位置:栈
void fun(void)
{
unsigned char str[] = "12345678";
const unsigned char str[] = "12345678";
unsigned int i = 5;
const unsigned int i = 5;
unsigned char *p ="12345678";
}
存储位置:Flash的RO段
unsigned char *p ="12345678";
static unsigned char *p ="12345678";
const unsigned char str[] = "12345678";
static const unsigned char str[] = "12345678";
static const unsigned int i = 5;
void fun(void)
{
static const unsigned char str[] = "12345678";
static const unsigned int i = 5;
}
存储位置:RW段
unsigned int i = 5;
static unsigned char str[] = "12345678";
unsigned char *p ="12345678";
static unsigned char *p ="12345678";
void fun(void)
{
static unsigned char str[] = "12345678";
}
计算内存是否溢出
Keil/MDK 编译完工程,得到如下信息:
Program Size: Code=25648 RO-data=400 RW-data=800 ZI-data=8752
Total RO Size (Code + RO Data) 26048 ( 25.44kB) Total RW Size (RW Data + ZI Data) 9552 ( 9.33kB) Total ROM Size (Code + RO Data + RW Data) 26372 ( 25.75kB)****(即烧/下载程序到FLASH/ROM时,所占用的最小空间)
Keil生成Bin文件
fromelf.exe --bin -o "$L@L.bin" "#L"
|