OpenEdv-开源电子网

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

Keil环境下 STM32编译后 Code ro-data rw-data zi-data求解释

[复制链接]

71

主题

183

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2013-1-29
在线时间
1 小时
发表于 2013-4-26 09:56:16 | 显示全部楼层 |阅读模式
我在keil环境下 开发STM32 以前看过一本书  上边解释 code=指令  ro-data=指令+只读变量  rw-data=已经初始化为非零的变量  zi-data是初始化为0和未被初始化的变量
我的程序编译后 :
Program Size: Code=8204 RO-data=11340 RW-data=44 ZI-data=516 
但是当我在程序里边加上一句 const u8 i=1; 之后编译
Program Size: Code=8204 RO-data=11340 RW-data=44 ZI-data=516  程序大小没有变化

我加了4句  const u8 i=1; const u8 j=1; const u8 z=1; const u8 k=1;  然后在编译
Program Size: Code=8204 RO-data=11340 RW-data=44 ZI-data=516   程序大小仍然没有变化

求高手相信解释 在keil环境下   Code ro-data rw-data zi-data 分别代表什么   还有我的数据为什么没有变化

另外 我的单片机 Flash 是512K  SRAM是 64KB  以上四个中 那些量相加不应该超过Flash总容量  那些量相加不应该超过SRAM总容量。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

344

主题

1464

帖子

12

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
8044
金钱
8044
注册时间
2015-10-15
在线时间
2907 小时
发表于 2016-7-29 11:05:31 | 显示全部楼层
Code, RO-data,RW-data,ZI-data
Code为程序代码部分
RO-data 表示 程序定义的常量const temp;
RW-data 表示 已初始化的全局变量
ZI-data 表示 未初始化的全局变量
Program Size: Code="18248" RO-data=320 RW-data=260 ZI-data=3952
Code, RO-data,RW-data ............flash
RW-data, ZIdata...................RAM
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 1 反对 0

使用道具 举报

71

主题

183

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2013-1-29
在线时间
1 小时
 楼主| 发表于 2013-4-26 10:29:54 | 显示全部楼层
自己顶一下..
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-4-26 10:33:44 | 显示全部楼层
回复【楼主位】langwanglx:
---------------------------------
你这些变量,如果没有被用掉,很可能直接就被MDK给优化掉了...
不会被编译进去的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

71

主题

183

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2013-1-29
在线时间
1 小时
 楼主| 发表于 2013-4-26 10:47:21 | 显示全部楼层
你好 谢谢你的回答 你说的这个问题我注意到了 但是 我这样写程序
const u8 KK=1;
void main(void)
{   if(KK==1)
    {/**代码*/   }
   else {/*代码*/}

}
很明显 KK已经被用到了  但是RO-data 仍然没有改变 只是 Code增加了36个字节 按照书上讲的 RO-DATA是只读变量的字节数 哪么我认为RO-DATA应该加1的.但是实际RO-data没有变化....
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2013-4-26 10:50:04 | 显示全部楼层
多种原因:
1,编译器分配程序存储空间的时候 是按“片”分配的,【一般FLASH架构的是单位可能是扇区之类的,当然也是跟编译器有关】 而不是按实际字节 , 为8的倍数; 所以假如 一个扇区 512字节, 那么 假如你只用到了一个, 它也是512 ,用到了510个 也是512 不变

2,变量没被用到的,基本都被优化掉了。

变量问题;
定义带const的变量 为常量 一般放在 ROM 区域[code]
系统定义的,带volitile 的 一般是寄存器区,【不一定,尤其是自定义的 变量就肯定不是了。】
而 普通 全局、静态、局部 都在RAM区域, 细分为静态存储区域、栈、堆等


如果你超过容量后 编译器就通不过了。会有提示的。
回复 支持 反对

使用道具 举报

71

主题

183

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2013-1-29
在线时间
1 小时
 楼主| 发表于 2013-4-26 11:37:26 | 显示全部楼层
回复【5楼】aleda303:
---------------------------------
谢谢你的回答 我反复试验了一下 KEIL中 STM32 的 分配应该是以4个字节为单位进行的 定义一个u8 增加4个字节 定义2个u8也是4个字节
FLASH内所占的空间 总是以4字节递增 检查了许多工程 所有的工程都遵循这个规律 (Code+rw-data+ro-data)之和总是4的倍数 而
在Flash中所占的空间 正好是这三个量的和 我这样理解正确吗?
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2013-4-26 11:46:30 | 显示全部楼层
对 code  应该是4的倍数,-不是8.

对 stm32 flash 编程的时候 擦除是按扇区 来的 , 整个程序块 是扇区大小的倍数
回复 支持 反对

使用道具 举报

71

主题

183

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2013-1-29
在线时间
1 小时
 楼主| 发表于 2013-4-26 12:01:27 | 显示全部楼层
回复【7楼】aleda303:
---------------------------------
Code 并不是4的倍数 而是Code+rw-data+ro-data)的和 你自己试验一下
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2200
金钱
2200
注册时间
2012-2-8
在线时间
35 小时
发表于 2013-4-26 18:52:55 | 显示全部楼层
百度一下
回复 支持 反对

使用道具 举报

33

主题

218

帖子

0

精华

高级会员

Rank: 4

积分
568
金钱
568
注册时间
2015-1-12
在线时间
75 小时
发表于 2020-4-2 14:22:17 | 显示全部楼层
(Code+rw-data+ro-data)之和正好是Flash中所占的空间 正好是这三个量的和 ,经过测试确实是这样
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-24 13:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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