STM32内存跟FLASH问题

时间:2022-09-19 23:48:59

RO: 常量

ZI: 未初始化的全局变量

RW: 初始化的全局变量

Code: 程序本身

Code, RO-data,RW-data ..............flash

RW-data, ZIdata...................RAM

初始化时, RW会从flash被拷贝到RAM

Program Size: Code=1564 RO-data=336 RW-data=32 ZI-data=1832

Code就是flash. 证明: 我现在注释掉一行:

//delay_ms(300);

Program Size: Code=1556 RO-data=336 RW-data=32 ZI-data=1832

再注释一行:

//LED1=0;

Program Size: Code=1548 RO-data=336 RW-data=32 ZI-data=1832

再注释一行:

//LED0=1;

Program Size: Code=1544 RO-data=336 RW-data=32 ZI-data=1832

其他都没变, 只有Code变化了.

以这个为基础:

Program Size: Code=1556 RO-data=336 RW-data=32 ZI-data=1832

接下来, 加一个static的变量.

static u8 i;

Program Size: Code=1556 RO-data=336 RW-data=32 ZI-data=1832

发现没有任何变化, 就是静态变量, 你不赋值, 就不占任何空间, 编译器好聪明.

接着, 声明后马上赋值:

static u8 i=2;

编译结果:

Program Size: Code=1556 RO-data=336 RW-data=32 ZI-data=1832

竟然没有任何变化, 也就是说, 只是赋初始值, 也是没有使用的静态变量也不占任何空间.

加一行代码:

i=3;

Program Size: Code=1568 RO-data=336 RW-data=36 ZI-data=1836

可以看到Code有变化, RW-data也增加了4个字节, 因为32位的系统的关系吧. 然后ZI也是增加了4个字节

如果不赋初始值, 直接后面才给i一个3:

Program Size: Code=1568 RO-data=336 RW-data=36 ZI-data=1836

没变化, 即, static的变量, 申明时就赋值了.

如果把static去掉, 在函数内申明一个普通变量i, 则:

Program Size: Code=1560 RO-data=336 RW-data=32 ZI-data=1832

跟基础相比:

Program Size: Code=1556 RO-data=336 RW-data=32 ZI-data=1832

除了Code没变化.

增加define

#define iah 0x0f

Program Size: Code=1560 RO-data=336 RW-data=32 ZI-data=1832

没有任何变化

即编译期间, 所有define都会被自动替换.

可见:

1. Code就是编译后的机器码

2. RO就是Read Only, 即常量

3. static的变量, 在初始化的时候, 会从flash放进内存

4. 普通变量只会在栈和堆中存在, 并存活于函数作用域, 初始化的时候并不占用内存.

5. 只有const修饰符才会增加RO.

参考链接:

http://blog.csdn.net/winmenaruto/article/details/6256770