tick_tock

tick_tock

0个粉丝

8

问答

0

专栏

19

资料

tick_tock  发布于  2013-11-28 22:21:02
采纳率 0%
8个问答
3381

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

 
STM的全局变量大小是否完全不影响程序空间的大小呢?
我来回答
回答1个
时间排序
认可量排序

timer

0个粉丝

9

问答

0

专栏

13

资料

timer 2013-11-28 22:22:58
认可0
全局变量是否占用最终程序的存储空间,这个问题其实早在我们学习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运行时库提供的代码,是由链接器把他们嵌入到你的用户代码里的。
现在,对于变量的空间分配,你是不是更了解了一些呢?
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区