关于stm32的Code、RO-data、 RW-data、 ZI-data的测试(一)

首先说明本文引用一些大佬的文章
https://www.cnblogs.com/LittleTiger/p/4812523.html

关于stm32编译之后,内部的Flash,以及SRAM的分布情况。网上有大篇文章说明Code、RO-data、 RW-data、
ZI-data的定义,
比如:https://blog.csdn.net/ybhuangfugui/article/details/75948282

但是用具体的代码测试实例比较少,以至于笔者之前在编写代码的时候,发现有时候情况与理论定义并不相符,颇为不解。后来几经测试,写下这篇文章,供那些想要彻底搞明白stm32内部program size问题的朋友参考。

为何理论和实际不相符?
第一次,按照ZI-data的定义(Zero Initialize没有初始化的可读写变量的大小)
于是随便在一个.c文件中申明了一个全局数组。
比如char a[100];
按理说,我点下编译之后,ZI-data会增加100。
但是实际发现,ZI-data区域毫无变化。
后来测试发现,原来这是由于我们的MDK(uvision V5.27.0.0)太智能了,当我们定义了一个全局变量,但是没有使用的时候,编译器就帮我们优化了,就相当于没有声明这个全局数组一样。
所以,我写了一个函数,将这个函数在main里面调用。注意:如果光是写这函数不调用,全局变量依旧会被优化掉。

放ZI-data还是放RW-data?
第二个有趣的事情:当我在定义一个全局变量,比如:
(1) u8 testzidata[100] = {‘0x01’,‘0x01’,‘0x01’,‘0x01’};
则这个时候,底下的RW-data区域就会增加100;
注意:上面的变量需要在下面被使用,否则同样被优化
如:
while(1)
{
for(i=0;i<100;i++)
{
testzidata[i] = i;
}
}

而如果是:
(2)u8 testzidata[100];
则这个时候,底下的ZI-data区域就会增加100;
理论原理:因为 u8 testzidata[100] ;只是声明了全局变量,
但是是未初始化变量,所以就被存储在ZI-data区域。
而 u8 testzidata[100] = {‘0x01’,‘0x01’,‘0x01’,‘0x01’};由于被初始化,于是就被放在RW-data区域。
这里的RW-data与ZI-data在物理都分配到SRAM上。
具体有什么区别,请看下文讲解。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值