打印

关于Keil For STM32中RO,RW,ZI字段的理解

[复制链接]
2088|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
21ID|  楼主 | 2013-10-28 08:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 21ID 于 2013-10-28 08:50 编辑

小弟在研究keil编译stm32芯片时,关于Code,RO-DATA,RW-DATA,ZI-DATA很是不解,从网上也找过很多资料,不过跟自己试验的结果都大相径庭。以下是我的试验结果,大侠们能不能给小弟解释一下
1, u8 TestArray[10];
Program Size: Code=23540 RO-data=692 RW-data=184 ZI-data=9944  
2, u8 TestArray[100];
Program Size: Code=23540 RO-data=692 RW-data=184 ZI-data=10032  
3, u8 TestArray[1000];
Program Size: Code=23540 RO-data=692 RW-data=184 ZI-data=10928  
4, u8 TestArray[10000];
Program Size: Code=23540 RO-data=692 RW-data=184 ZI-data=19928  
上述编译的结果的解释:

1, u8 TestArray[10] = {1};
Program Size: Code=23540 RO-data=692 RW-data=196 ZI-data=9932  
2, u8 TestArray[100] = {1};
Program Size: Code=23540 RO-data=692 RW-data=284 ZI-data=9932  
3, u8 TestArray[110] = {1};
Program Size: Code=23540 RO-data=692 RW-data=296 ZI-data=9928  
4, u8 TestArray[300] = {1};
Program Size: Code=23604 RO-data=692 RW-data=484 ZI-data=9932  
5, u8 TestArray[1000] = {1};
Program Size: Code=23604 RO-data=692 RW-data=1184 ZI-data=9928  
上述编译的结果的解释:

1, u8 TestArray;
Program Size: Code=23540 RO-data=692 RW-data=188 ZI-data=9932  
2, u8 TestArray,TestArray1;
Program Size: Code=23540 RO-data=692 RW-data=188 ZI-data=9932  
3, u8 TestArray,TestArray1,TestArray2;
Program Size: Code=23540 RO-data=692 RW-data=188 ZI-data=9932  
上述编译的结果的解释:

1, u8 TestArray = 1;
Program Size: Code=23540 RO-data=692 RW-data=188 ZI-data=9932  
2, u8 TestArray = 1,TestArray1 = 1;
Program Size: Code=23540 RO-data=692 RW-data=188 ZI-data=9932  
上述编译的结果的解释:

1, const u8 TestArray = 1;
Program Size: Code=23540 RO-data=692 RW-data=184 ZI-data=9928  
2, const u8 TestArray = 1;const u8 TestArray1 = 1;
Program Size: Code=23540 RO-data=692 RW-data=184 ZI-data=9928  
3, const u8 TestArray;
Program Size: Code=23540 RO-data=692 RW-data=184 ZI-data=9928  
4, const u8 TestArray;const u8 TestArray1;
Program Size: Code=23540 RO-data=692 RW-data=184 ZI-data=9928  
上述编译的结果的解释:

1, static u8 TestArray;
Program Size: Code=23540 RO-data=692 RW-data=188 ZI-data=9932  
2, static u8 TestArray = 1;
Program Size: Code=23540 RO-data=692 RW-data=188 ZI-data=9932  
上述编译的结果的解释:

沙发
香水城主| | 2013-10-28 09:09 | 只看该作者
检查对比一下各段的起始地址和各个变量的起始地址。

使用特权

评论回复
板凳
lllaaa| | 2013-10-28 09:20 | 只看该作者
ro-data只读数据。一般是类似const int abc[100]这种形式来声明的。这种编译的时候只需要放到flash就好了。不用占用ram
rw-data可写数据。类似于int abc[100] = {1};由于要写,那么编译的时候不但要占用flash,链接的时候变量地址还需要指向ram,并且在执行main函数之前还需要把初始化好的数据搬运到ram里面(但也可能编译器会优化,只对单个值进行复制减少flash占用量)。因此两个都要占用
zi-data未初始化初值数据。类似于int abc[100];这种形式。由于没有初始化值,那只需要记个账,到时候ram里面划一片地址给他就行了。所以不用占用flash空间。

使用特权

评论回复
地板
21ID|  楼主 | 2013-10-28 09:56 | 只看该作者
lllaaa 发表于 2013-10-28 09:20
ro-data只读数据。一般是类似const int abc[100]这种形式来声明的。这种编译的时候只需要放到flash就好了。 ...

能解释下面为什么编译出来的都是一样的,难道是编译器优化了?
1, u8 TestArray;
Program Size: Code=23540 RO-data=692 RW-data=188 ZI-data=9932  
2, u8 TestArray,TestArray1;
Program Size: Code=23540 RO-data=692 RW-data=188 ZI-data=9932  
3, u8 TestArray,TestArray1,TestArray2;
Program Size: Code=23540 RO-data=692 RW-data=188 ZI-data=9932  

使用特权

评论回复
5
香水城主| | 2013-10-28 10:02 | 只看该作者
提示:从数据对齐(alignment)方面考虑。

使用特权

评论回复
6
airwill| | 2013-10-28 11:03 | 只看该作者
是的, 本来应该是不同的. 但是由于编译器进行了4字节对齐.
3 个变量和1个变量都被对齐到 4字节空间了, 导致 RW-data 使用空间不变

使用特权

评论回复
7
huzi2099| | 2013-10-28 13:24 | 只看该作者
21ID 发表于 2013-10-28 09:56
能解释下面为什么编译出来的都是一样的,难道是编译器优化了?
1, u8 TestArray;
Program Size: Code=235 ...

变量没有使用过.

使用特权

评论回复
8
zdx818| | 2013-10-28 13:42 | 只看该作者
顶7楼,
如果是数组,一定会分配空间。
如果是变量,特别是没有用过的局部变量,还会有警告,全局变量他不知道你是否会在其他地方使用,只有等到连接时候才优化。

使用特权

评论回复
9
21ID|  楼主 | 2013-10-30 23:29 | 只看该作者
谢谢各位!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

157

主题

912

帖子

5

粉丝