OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2080|回复: 5

关于MDK编译程序后显示的 CODE RO-data RW-data ZI-data的大小含义的个人理解和自己遇到的问题

[复制链接]

22

主题

87

帖子

0

精华

高级会员

Rank: 4

积分
664
金钱
664
注册时间
2019-1-30
在线时间
111 小时
发表于 2019-7-26 15:16:56 | 显示全部楼层 |阅读模式
10金钱
自己关于这几项的理解:CODE :通俗点理解就是代码量(字节数表示),即显示代码占用了多少字节。
RO-data :Read_Only_Data表示只读的数据,如const修饰的常量数据。
RW_data:Read_Write_Data 表示可读写的数据,也就是程序中已经初始化的那些变量所占用的字节数。
ZI_data:Zero_Init_Data 表示程序中已经定义但是未被初始化或者被初始化为0的那些变量。Keil编译器是默认把你那些定义但是未初始化的变量赋值为0的。如果在其他编译器就不清楚了,这可能是keil的特性,但是如果定义了变量,这个变量我们从栈的角度理解的话,这个变量没有被初始化的话,它不一定是0,因为这个这个变量所在的栈的那个位置可能被污染过。因此定义了变量还是要有将它初始化的一个习惯。
查看.map文件在文件的最后有这段代码显示:
==============================================================================

    Total RO  Size (Code + RO Data)               120208 ( 117.39kB)
    Total RW  Size (RW Data + ZI Data)             43024 (  42.02kB)
    Total ROM Size (Code + RO Data + RW Data)     120264 ( 117.45kB)  // 代表程序占用的ROM的字节总数,即下载到ROM flash中的大小。

==============================================================================

对以上代码段的理解如下:
Total ROM Size (Code + RO Data + RW Data)代表所写的程序占用的ROM的字节总数,也就是说程序所下载到ROM flash 中的大小。为什么Rom中还要存RW,因为掉电后RAM中所有数据都丢失了,每次上电RAM中的数据是被重新赋值的,每次这些固定的值就是存储在Rom中的,为什么不包含ZI段呢,是因为ZI数据都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可,包含进去反而浪费存储空间。
实际上,ROM中的指令至少应该有这样的功能:
       1. 将RW从ROM中搬到RAM中,因为RW是变量,变量不能存在ROM中。
       2. 将ZI所在的RAM区域全部清零,因为ZI区域并不在Image中,所以需要程序根据编译器给出的ZI地址及大小来将相应得RAM区域清零。ZI中也是变量,同理:变量不能存在ROM中。
       在程序运行的最初阶段,RO中的指令完成了这两项工作后C程序才能正常访问变量。否则只能运行不含变量的代码。

存在的问题:
工程项目在编译完后,MDK显示的编译情况如下图所示:
截图未命名1.jpg
即:Code = 85346 RO-data = 34862 RW-data = 576 ZI-data = 42448

添加如下图所示的数组,并编译后的结果:
截图未命名2.jpg
编译后显示:Code = 85346 RO-data = 34862 RW-data = 576 ZI-data = 43248 ,我认为应该RW_data增加800个字节大小,而不是ZI-data,因为这个定义的数组我在函数中进行了初始化并且初始化为1。
如果将这段for循环的初始化代码去除,采用以下方式进行编译:
截图未命名3.jpg
发现 Code = 85346 RO-data = 34862 RW-data = 576 ZI-data = 42448和最开始的编译的结果是相同的,但是我认为这个时候应该在RW-data中增加20个字节大小。为什么编译的结果和理解的不同呢,难道是我理解错了,求大神指点。





最佳答案

查看完整内容[请看2#楼]

数据得用到才会参与编译
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2019-7-26 15:16:57 | 显示全部楼层
数据得用到才会参与编译
回复

使用道具 举报

22

主题

87

帖子

0

精华

高级会员

Rank: 4

积分
664
金钱
664
注册时间
2019-1-30
在线时间
111 小时
 楼主| 发表于 2019-7-28 20:34:45 | 显示全部楼层
正点原子 发表于 2019-7-27 02:49
数据得用到才会参与编译

嗯嗯。谢谢原子哥。
回复

使用道具 举报

22

主题

87

帖子

0

精华

高级会员

Rank: 4

积分
664
金钱
664
注册时间
2019-1-30
在线时间
111 小时
 楼主| 发表于 2019-7-28 20:40:28 | 显示全部楼层
正点原子 发表于 2019-7-27 02:49
数据得用到才会参与编译

原子哥,那像第二种情况,我在函数中对定义的这个全局数组进行了初始化,相当于这个变量得到了应用,在编译器编译后,不应该是RW-data增加相应的字节吗,但是编译后确实ZI-data增加了相应的字节数,不懂了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2019-7-29 02:25:09 | 显示全部楼层
zhangxiaolin 发表于 2019-7-28 20:40
原子哥,那像第二种情况,我在函数中对定义的这个全局数组进行了初始化,相当于这个变量得到了应用,在编 ...

全局数组都是ZI数据
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

22

主题

87

帖子

0

精华

高级会员

Rank: 4

积分
664
金钱
664
注册时间
2019-1-30
在线时间
111 小时
 楼主| 发表于 2019-7-29 09:25:25 | 显示全部楼层
如果变量被const修饰过了,无论这个变量有没有被初始化,都是存放在ROM中,MDK编译过后RO-data会增加相应的字节数量。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-5 09:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表