打印

请教关于怎样理解RO-data

[复制链接]
4878|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jd吕凯|  楼主 | 2012-5-16 16:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在函数内初始化一个数组,为什么RO-data会增加?这个不是存储常量的吗?
沙发
香水城| | 2012-5-16 17:36 | 只看该作者
如何在函数内初始化一个数组?

使用特权

评论回复
板凳
ilovezeno| | 2012-5-16 18:43 | 只看该作者
如果你在函数里初始化的是非零的静态数组,你觉得为什么RO不增加,不增加你初始化的数据放哪里。。。。

使用特权

评论回复
地板
ilovezeno| | 2012-5-16 18:43 | 只看该作者
如果你在函数里初始化的是非零的数组,你觉得为什么RO不增加,不增加你初始化的数据放哪里。。。。

使用特权

评论回复
5
weicz| | 2012-5-17 09:17 | 只看该作者
3# ilovezeno
静态数组不在Ro-data中吧,用了const关键字的数组才会在RO-data中,楼主能不能给点细节啊

使用特权

评论回复
6
jd吕凯|  楼主 | 2012-5-17 10:39 | 只看该作者
我后来自己用软件验证发现,全局变量的数组初始化后不管是否定义成静态的,它的初始化数据都在RO-data中,并且RW-data也增加了16(数组大小是16),这个我能理解。
我又把这个数组放在函数块里面,这次我发现,如果不加上static,RO-data并没有增加16,只有加上static,RO-data才会增加16,更让我不理解的是,为什么此时RW-data也增加了16?局部变量不是存储在栈里的吗?而且我看网上很多对于RW-data的解释是已初始化的全局变量。

使用特权

评论回复
7
香水城| | 2012-5-17 11:50 | 只看该作者
全局变量的数组初始化不是由你的程序执行的,这就意味着初始数据需要有一个存放的地方,编译器选择了RO-Data区,事情就这么简单。

作为局部变量,如果不加上static,编译器选择增加一段程序,使用立即数的方式对数组初始化,所以自然就没有RO-Data,但程序量增加了,对于Flash消耗的效果是一样的,不一样的是消耗的容量。

RW-data的增加更容易理解,这是用于存放数据在RAM中,你可以随时在程序中修改它。

使用特权

评论回复
8
i55| | 2012-5-17 12:12 | 只看该作者
全局变量的数组初始化不是由你的程序执行的,这就意味着初始数据需要有一个存放的地方,编译器选择了RO-Data区,事情就这么简单。

作为局部变量,如果不加上static,编译器选择增加一段程序,使用立即数的方式对数 ...
香水城 发表于 2012-5-17 11:50

大错特错了。

RO是常量,在flash里面,不占用ram。如const uint8_t i55[5]={0,1,2,3,4};

RW是初始化变量,即占用flash也占用ram。如uint8_t i55[5]={0,1,2,3,4};
数组的初值在flash里面,上电后搬运到ram里面。

不需要初始化的变量时ZI,不占用flash只占用ram。如uint8_t i55[5];
ZI也就是bss段,上电后初始化程序对其清零。
如果是IAR,可以用__no_init关键字阻止初始化程序对相应的ZI清零,MDK也有类似关键字,记不住了,自己查help吧。

使用特权

评论回复
9
i55| | 2012-5-17 12:14 | 只看该作者
补充一下:
flash的使用量是Code+RO+RW。
ram的使用量是RW+ZI。

自己看看map文件就全明白了。

使用特权

评论回复
10
john_lee| | 2012-5-17 13:08 | 只看该作者
我又把这个数组放在函数块里面,这次我发现,如果不加上static,RO-data并没有增加16,只有加上static,RO-data才会增加16,更让我不理解的是,为什么此时RW-data也增加了16?局部变量不是存储在栈里的吗?而且我看网上很多对于RW-data的解释是已初始化的全局变量。jd吕凯 发表于 2012-5-17 10:39


如果楼主确定没有加上static时,RW-data没有增加,那么就好说了。
在函数内定义的static变量,准确地说,是“静态局部变量”,作用域跟普通局部变量一样,限于定义该变量的复合语句中,但生存期却与“全局变量”一样,都是静态生存期。

已初始化的静态生存期的变量,由于存储空间位于 RAM,显然在上电时不可能有希望的数据,为了满足程序在main之后就已经初始化了的要求,编译器会为这个初始化数据生成一个副本,存放到RO-data,在启动时,由启动程序(在main之前执行)把这个副本复制到位于 RAM 中的正本静态变量。

所以,你看到的加了static后,RO-data增加了,实际上就是增加了这个副本的数据。

使用特权

评论回复
11
15601566816| | 2012-5-17 13:14 | 只看该作者
。。。。。。

使用特权

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

本版积分规则

0

主题

169

帖子

1

粉丝