OpenEdv-开源电子网

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

STM32全局变量占用程序存储空间吗?

[复制链接]

12

主题

39

帖子

4

精华

高级会员

Rank: 4

积分
724
金钱
724
注册时间
2013-5-10
在线时间
2 小时
发表于 2013-5-10 01:30:27 | 显示全部楼层 |阅读模式

原文链接http://blog.csdn.net/hexiaolong2009/article/details/8908417

全局变量是否占用最终程序的存储空间,这个问题其实早在我们学习C语言的时候就已经告诉我们答案了。我隐约记得初学C语言的时候,书本上告诉我们:

全局自动变量——保存在读写数据段

全局静态变量——保存在读写数据段

全局常量——保存在只读数据段

局部自动变量——保存在栈空间里的

而我们在做单片机程序的时候,由于都是用的C编程,所以数据的存储也是一样的。上面的读写数据段在单片机里就是RW-data段,上面的只读数据段在单片机里就是RO-data,还有一个零初始化数据段ZI-data段(由此可见,RW-data加上ZI-data就是总共要分配的RAM空间大小),最后一个Code段就不用介绍了,大家都明白。

那么究竟一个STM32程序编译链接完成后的BIN文件大小到底跟所申请的全局变量有没有关系呢?答案是无关!最终生成的BIN文件大小只与程序的代码段(Code段)和只读数据段(RO-data)有关,即BIN文件大小=Code段+RO-data段。

为了验证这一点,我特地拿正点原子战舰开发板的案例《实验48 串口IAP实验》来给大家演示,证明目标代码的大小与程序中所申请的全局变量大小无关。选择正点原子的这个案例有两个原因:1.本人目前正在学习STM32 IAP编程;2.该例程中分配了一个全局变量u8 USART_RX_BUF[USART_REC_LEN],USART_REC_LEN的长度为55K,几乎占用了80%的SRAM空间,对本文的论点起着典范作用。

首先我们不对工程进行修改,如下图:

编译链接后,生成的目标代码结果如下:

可以看到,Program Size: Code=19208 RO-data=3036 RW-data=64 ZI-data=62400  
得出ROM=21.7K  RAM=61K

我们再将USART_REC_LEN宏的长度修改为55,空间大大缩小,如下图:

编译链接后,目标代码大小如下:

可以看到Program Size: Code=19208 RO-data=3036 RW-data=64 ZI-data=6136  
得到ROM=21.7K  RAM=6K

而两次编译后,我们到工程目录下找到IAP.BIN文件,查看该文件的大小,都是21.7K,如下图:

由此可见,目标代码的大小与程序中所申请的全局变量大小无关,而只与代码段(Code段)和只读数据段(RO-data段)有关,而全局变量的大小只会影响到占用SRAM的大小。那么既然最终的目标代码大小跟全局变量的大小无关,是不是目标代码就一点也不包含全局变量了呢?呵呵,如果不包含全局变量,那程序运行的时候就不知道全局变量在哪里啦!当然会包含全局变量啦,只是不是包含它们的存储空间,而是包含他们分配空间的信息,比如该全局变量的起始地址、空间大小、是否要用0初始化等信息,这样就只会占用目标代码非常少的空间。那全局变量又是在什么时候分配的呢?全局变量的分配是在程序复位中断执行后,进入main函数之前分配的。那么全局变量又是由谁来分配的呢?全局变量的分配工作在你的用户程序中是看不到的,它们是有开发环境提供的C运行时库提供的代码,是由链接器把他们嵌入到你的用户代码里的。

现在,对于变量的空间分配,你是不是更了解了一些呢?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2012-8-6
在线时间
0 小时
发表于 2013-5-10 03:03:08 | 显示全部楼层
回复 支持 反对

使用道具 举报

96

主题

762

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1228
金钱
1228
注册时间
2012-10-19
在线时间
15 小时
发表于 2013-5-10 08:28:16 | 显示全部楼层
哎,我太喜欢用全局变量了~
回复 支持 反对

使用道具 举报

76

主题

355

帖子

0

精华

高级会员

Rank: 4

积分
671
金钱
671
注册时间
2012-9-19
在线时间
5 小时
发表于 2013-5-10 08:54:59 | 显示全部楼层
吗啊额儿科额~!
具有资深STM32点灯技术,
回复 支持 反对

使用道具 举报

71

主题

183

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2013-1-29
在线时间
1 小时
发表于 2013-6-5 08:58:02 | 显示全部楼层
回复【楼主位】hexiaolong2008:
---------------------------------
楼主你好
我看了你解答的问题 但是我以前看过一本书 和你的问题有点才冲突 
那本书上的讲解是这样的 STM32 的FLASH占用大小 应该是code +RO-data+RW-data;  也就是说 在所有的全局变量中 没有被初始化为0 的全局变量也占用了flash的空间 我认为是这样的 假如 RW-data不占用flash空间 哪么程序如何知道这个全局变量的初始值是多少?
另外 关于SRAM  程序占用SRAM的空间 当然是RW-data+ZI-data了 这个是一致的 
也就是说 RW-data 即占用了 flash空间 也占用了SRAM空间 
我认为是这样的  呵呵 不对的话 求拍砖.
回复 支持 反对

使用道具 举报

12

主题

39

帖子

4

精华

高级会员

Rank: 4

积分
724
金钱
724
注册时间
2013-5-10
在线时间
2 小时
 楼主| 发表于 2013-6-7 21:54:00 | 显示全部楼层
回复【5楼】langwanglx:
---------------------------------
嗯,你说的对,后来在阿莫电子论坛也有人提出了同样的反对意见,经过实践证明,你的接结论是对的,我对原始博客进行了修改,你可以直接点击原文博客链接,里面有说明的。
回复 支持 反对

使用道具 举报

1

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2012-10-13
在线时间
50 小时
发表于 2013-10-23 23:15:20 | 显示全部楼层
回复【楼主位】hexiaolong2008:
---------------------------------
看了楼主的帖子,这知识我不懂,受教了,楼主,什么触发你研究起这个知识点的呀?
研究这个知识点有什么意义哇?请教下,因为我突然想到这个问题。
得之我幸,失只我命!
回复 支持 反对

使用道具 举报

12

主题

39

帖子

4

精华

高级会员

Rank: 4

积分
724
金钱
724
注册时间
2013-5-10
在线时间
2 小时
 楼主| 发表于 2013-10-29 13:45:16 | 显示全部楼层
回复【7楼】yihui184:
---------------------------------
因为想对程序内部的内存分布能有个透彻的了解,所以就想到了这里。。。。
回复 支持 反对

使用道具 举报

13

主题

48

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2014-7-3
在线时间
38 小时
发表于 2014-7-3 09:35:54 | 显示全部楼层
楼主你好,那你能不能继续说说局部变量呢?局部变量是如何非配空间会分配到哪里去
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2014-10-31 16:42:36 | 显示全部楼层
good&mark
回复 支持 反对

使用道具 举报

7

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2013-4-9
在线时间
26 小时
发表于 2015-2-6 09:54:49 | 显示全部楼层
mark mark
回复 支持 反对

使用道具 举报

1

主题

215

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2013-9-23
在线时间
4 小时
发表于 2015-2-6 13:19:03 | 显示全部楼层
mark 学习
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2015-4-3
在线时间
6 小时
发表于 2015-4-3 09:39:13 | 显示全部楼层
你说的不对,code 和ro rw zi都是要烧写到flash中的,在设备启动后,内置的boot程序会依据分散加载机制,将rw zi加载到sram区中。
回复 支持 反对

使用道具 举报

12

主题

39

帖子

4

精华

高级会员

Rank: 4

积分
724
金钱
724
注册时间
2013-5-10
在线时间
2 小时
 楼主| 发表于 2015-4-3 09:56:46 | 显示全部楼层
回复【13楼】huzhongmoshui:
---------------------------------
嗯,你说的是对的,请看5楼。
回复 支持 反对

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2016-4-2
在线时间
17 小时
发表于 2016-4-5 20:32:45 | 显示全部楼层
huzhongmoshui 发表于 2015-4-3 09:39
你说的不对,code 和ro rw zi都是要烧写到flash中的,在设备启动后,内置的boot程序会依据 ...

你说的很对,就像普通PC上exe中即包含rw-data又包含CODE,否则加载exe后如何得知一些全局变量的初始值阿。一个道理。
回复 支持 反对

使用道具 举报

1

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2015-11-26
在线时间
25 小时
发表于 2016-4-6 14:46:37 | 显示全部楼层
不错我还是要顶一下
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 03:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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