OpenEdv-开源电子网

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

关于C语言【全局变量】与【全局常量】在STM32中储存方式的区别

[复制链接]

1

主题

8

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2016-12-27
在线时间
4 小时
发表于 2016-12-27 20:09:43 | 显示全部楼层 |阅读模式
1金钱
本人在使用 STM32液晶屏的时候,在工程里面 写入了一个 u16 a[]={这张图片的RGB565代码,1万个数据};
编译后 HEX文件有 88KB 1.png
后来 试着 在数组前面增加了一个 const修饰 , const u16 a[]={这张图片的RGB565代码,1万个数据};
编译后 HEX文件约200KB 2.png

3.png
4.png

搞不明白的是 这100多KB差别在哪里。

最佳答案

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

无const的数据,存放在RAM区。有const的数据存放在flash区。就是这个区别而已。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-12-27 20:09:44 | 显示全部楼层
无const的数据,存放在RAM区。有const的数据存放在flash区。就是这个区别而已。  
回复

使用道具 举报

43

主题

481

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1352
金钱
1352
注册时间
2014-12-24
在线时间
321 小时
发表于 2016-12-27 20:18:27 | 显示全部楼层
哎!这个基本常识,却不停地有人误解。我再帮大家说一句,hex文件的大小与烧录到芯片里的程序大小没有关系!
回复

使用道具 举报

26

主题

280

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2013-8-2
在线时间
279 小时
发表于 2016-12-27 20:43:42 | 显示全部楼层
jinggx 发表于 2016-12-27 20:18
哎!这个基本常识,却不停地有人误解。我再帮大家说一句,hex文件的大小与烧录到芯片里的程序大小没有关系 ...

LZ问的,跟你回答的不是同一个意思。
而且你说的也不完全对,下载到芯片里的是bin,hex里包含bin、地址等信息。
hex越大bin越大,理论上也是有关系的。
博客:http://blog.csdn.net/feilusia
CC2541群(127442605);CC2640群(557278427);
Android群(541462902);STM8/STM32群(164311667);
Linux群(512598061);职场交流群(450154342);
回复

使用道具 举报

43

主题

481

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1352
金钱
1352
注册时间
2014-12-24
在线时间
321 小时
发表于 2016-12-27 22:18:25 | 显示全部楼层
feilusia 发表于 2016-12-27 20:43
LZ问的,跟你回答的不是同一个意思。
而且你说的也不完全对,下载到芯片里的是bin,hex里包含bin、地址 ...

我答非所问,那请你来回答!

能明白hex文件大小与烧录到芯片里的程序大小无关,就能明白他所提问题的原因了。

你说hex与bin有关,那你说说他们关系可以怎么样量化?比如如可通过hex文件的大小(注意是文件大小,不是读了hex文件内容)来计算bin的大小?

我说一个100k的hex和一个200k的hex可以表述出一模一样的bin,你认同吗?
回复

使用道具 举报

43

主题

481

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1352
金钱
1352
注册时间
2014-12-24
在线时间
321 小时
发表于 2016-12-27 22:47:54 | 显示全部楼层
本帖最后由 jinggx 于 2016-12-27 22:50 编辑

另外再说一句,还是自己弄清楚了再去反驳别人。

你说hex越大bin越大,不过据我所知不是这样的。
bin文件一般都是被填充满的,与芯片容量大小相等,所以bin文件是固定大小。hex文件也可以比bin文件小。
回复

使用道具 举报

26

主题

280

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2013-8-2
在线时间
279 小时
发表于 2016-12-27 23:26:55 | 显示全部楼层
jinggx 发表于 2016-12-27 22:18
我答非所问,那请你来回答!

能明白hex文件大小与烧录到芯片里的程序大小无关,就能明白他所提问题的 ...

小兄弟,性子急做不好技术的。
1、我说你答非所问,不代表我能解答,这是两个不同事情。
2、LZ问的是“两个hex大小不一致是什么导致的?”,你回答的是“hex与bin没有关系”,然而跟LZ问题有半毛钱关系吗?

博客:http://blog.csdn.net/feilusia
CC2541群(127442605);CC2640群(557278427);
Android群(541462902);STM8/STM32群(164311667);
Linux群(512598061);职场交流群(450154342);
回复

使用道具 举报

11

主题

1044

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3722
金钱
3722
注册时间
2011-5-23
在线时间
2013 小时
发表于 2016-12-28 00:14:51 | 显示全部楼层
[mw_shl_code=c,true]    char array1[4]; // ZI-data, bss
    char array2[4]={1,2,3,4};// ro+rw, copy
    const char array3[4]={1,2,3,4};// ro [/mw_shl_code]
RT-Thread RTOS 音频,WIFI,蓝牙
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2016-12-27
在线时间
4 小时
 楼主| 发表于 2016-12-28 10:04:56 | 显示全部楼层
jinggx 发表于 2016-12-27 22:18
我答非所问,那请你来回答!

能明白hex文件大小与烧录到芯片里的程序大小无关,就能明白他所提问题的 ...

我比较好奇的还是 hex文件里多了什么东西, 数据量我说错了, 数据量是 45000B 。

反正不管加不加const , 这堆数据肯定都是先存在ROM中,然后初始化的时候 无const的会将这些数据copy到RAM中。

那HEX文件中描述bin文件的差别在哪里。
回复

使用道具 举报

11

主题

1044

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3722
金钱
3722
注册时间
2011-5-23
在线时间
2013 小时
发表于 2016-12-28 10:10:10 | 显示全部楼层
本帖最后由 aozima 于 2016-12-28 10:11 编辑

自己仔细对比MAP文件呀。

一般来讲,加不加const只会影响RAM的占用,生成的BIN应该是差不多的。

但有一种可能就是:
MDK的链接器应该有压缩功能的,所以当没有const时,虽然占用RAM大,但RO中的init却可以压缩,所以出来的镜像比较小。
而有const时,就不能压缩了,所以镜像会大。
RT-Thread RTOS 音频,WIFI,蓝牙
回复

使用道具 举报

3

主题

401

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1766
金钱
1766
注册时间
2015-6-11
在线时间
312 小时
发表于 2016-12-28 10:42:01 | 显示全部楼层
本帖最后由 zc123 于 2016-12-28 10:46 编辑
777ai77 发表于 2016-12-28 10:04
我比较好奇的还是 hex文件里多了什么东西, 数据量我说错了, 数据量是 45000B 。

反正不管加不加cons ...

hex里面包含的信息和bin其实是一样的,只是换了一种存储方式而已。我是写过一个hex和bin互转的小脚本才明白的。
至于大小为什么不一样的原因是基本上是keil的优化
被定义为const的变量是一定会写入到生成的代码中的,
而只定义未被调用的全局变量keil会优化掉,不是压缩,而是这个变量被删除了,如果想让代码大小一致,可以程序里添加个print(a),就可以看到一样了
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2016-12-27
在线时间
4 小时
 楼主| 发表于 2016-12-28 10:56:58 | 显示全部楼层
zc123 发表于 2016-12-28 10:42
hex里面包含的信息和bin其实是一样的,只是换了一种存储方式而已。我是写过一个hex和bin互转的小脚本才明 ...

我上述的程序里头,确实调用到这个全局变量,并没有优化掉。
回复

使用道具 举报

3

主题

401

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1766
金钱
1766
注册时间
2015-6-11
在线时间
312 小时
发表于 2016-12-28 11:22:25 | 显示全部楼层
777ai77 发表于 2016-12-28 10:56
我上述的程序里头,确实调用到这个全局变量,并没有优化掉。

你把生成的.map文件最后的生成的内部信息贴出来,正常这是不可能的,这不是偏差了图片存储的信息,而是偏差了很多。还有bin->hex比率是2.8125,就算换算成bin,你这也差的太多,应该是有错误
回复

使用道具 举报

43

主题

481

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1352
金钱
1352
注册时间
2014-12-24
在线时间
321 小时
发表于 2016-12-28 12:52:27 | 显示全部楼层
有const编译后放在RO-data中,无const编译后放在RW-data中,两种情况烧录在芯片中所占的FLASH大小几乎相等。再说一遍:hex文件的大小与烧录到芯片里的程序大小没有关系。虽说是常识,却不停地有人误解,总认为hex就是程序的大小。还有,还有谁非要固执地认为hex和bin文件大小有关联。那我也不想多说了。。。。
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2016-12-27
在线时间
4 小时
 楼主| 发表于 2016-12-28 13:26:20 | 显示全部楼层
zc123 发表于 2016-12-28 11:22
你把生成的.map文件最后的生成的内部信息贴出来,正常这是不可能的,这不是偏差了图片存储的信息,而是偏 ...

内容太长了,我打了个压缩文件 map.zip (216.82 KB, 下载次数: 190)
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2016-12-27
在线时间
4 小时
 楼主| 发表于 2016-12-28 13:28:00 | 显示全部楼层
jinggx 发表于 2016-12-28 12:52
有const编译后放在RO-data中,无const编译后放在RW-data中,两种情况烧录在芯片中所占的FLASH大小几乎相等 ...

这点我已经知道了,现在就是比较好奇,hex文件的区别
回复

使用道具 举报

3

主题

401

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1766
金钱
1766
注册时间
2015-6-11
在线时间
312 小时
发表于 2016-12-28 16:38:32 | 显示全部楼层
本帖最后由 zc123 于 2016-12-28 16:41 编辑

在no const里面,最后面的RW数据明显被优化掉了,
==============================================================================
      Code (inc. data)   RO Data    RW Data    ZI Data      Debug   
     21342        926       6738      45128       1848     312005   Grand Totals
     21342        926       6738       4220       1848     312005   ELF Image Totals (compressed)
     21342        926       6738       4220          0          0   ROM Totals
==============================================================================
   Total RO  Size (Code + RO Data)                28080 (  27.42kB)
   Total RW  Size (RW Data + ZI Data)             46976 (  45.88kB)
   Total ROM Size (Code + RO Data + RW Data)  32300 (  31.54kB) //这个是bin文件大小
在const里面没有优化
==============================================================================

    Total RO  Size (Code + RO Data)                72992 (  71.28kB)
    Total RW  Size (RW Data + ZI Data)              1976 (   1.93kB)
    Total ROM Size (Code + RO Data + RW Data)      73120 (  71.41kB)  //这个是bin文件大小,
==============================================================================
对于你程序调用到a表示怀疑。
如果想看生成的bin文件在Options->User->after Build下添加fromelf --bin !L --output ramdisk.bin, 并打勾,再看看

回复

使用道具 举报

17

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2013-12-14
在线时间
567 小时
发表于 2016-12-28 16:43:26 | 显示全部楼层
关注一下这个帖子,一直没怎么研究过.map文件,这个文件可以看出很多有用的信息。

.map文件好像还可以看出程序最后死到哪里了。
半导体->模拟电路->数字电路->单片机->汇编->C->操作系统->java
回复

使用道具 举报

6

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
341
金钱
341
注册时间
2015-9-22
在线时间
32 小时
发表于 2016-12-28 17:46:04 | 显示全部楼层
东北小辉辉 发表于 2016-12-28 16:43
关注一下这个帖子,一直没怎么研究过.map文件,这个文件可以看出很多有用的信息。

.map文件好像还可以看 ...

.map 文件还有查找程序运行出错的功能的?    真的假的啊???
嵌入式开发微信公众号:嵌入式STM32软硬件开发
STM32交流,加好友,Q707372788
STM32交流群:383260480
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2016-12-27
在线时间
4 小时
 楼主| 发表于 2016-12-28 19:36:40 | 显示全部楼层
zc123 发表于 2016-12-28 16:38
在no const里面,最后面的RW数据明显被优化掉了,
==================================================== ...

确实调用到了,已经附上源程序代码,删掉了一些不需要的函数。 在interface.c内部调用到 这个数组。分const和no_const两个程序,均已实物测试可以在LCD屏幕上 显示图片。 程序源码.zip (5.21 MB, 下载次数: 119)
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2016-12-27
在线时间
4 小时
 楼主| 发表于 2016-12-29 15:45:58 | 显示全部楼层
jinggx 发表于 2016-12-28 12:52
有const编译后放在RO-data中,无const编译后放在RW-data中,两种情况烧录在芯片中所占的FLASH大小几乎相等 ...

我按16楼的方法生成了bin文件,确实 有const的 bin文件72KB, 无const 的bin文件 32KB。 已经在实物上测试过,均可以显示正常显示出图片。 源码已经上传到19楼了。
回复

使用道具 举报

43

主题

481

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1352
金钱
1352
注册时间
2014-12-24
在线时间
321 小时
发表于 2016-12-29 16:13:25 | 显示全部楼层
777ai77 发表于 2016-12-29 15:45
我按16楼的方法生成了bin文件,确实 有const的 bin文件72KB, 无const 的bin文件 32KB。 已经在实物上测试 ...

把 u16改成u32 类型可能结果就一样大小了,我没有试,你可以去试一下。

原因:据我分析,stm32的FLASH以32位存储,所以const类型数据都会被强制转换为uint32的长度。
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2016-12-27
在线时间
4 小时
 楼主| 发表于 2016-12-29 17:18:49 | 显示全部楼层
jinggx 发表于 2016-12-29 16:13
把 u16改成u32 类型可能结果就一样大小了,我没有试,你可以去试一下。

原因:据我分析,stm32的FLASH ...

无const改成 u32  build不通过。 空间不够了
..\OBJ\TOUCH.axf: Error: L6406E: No space in execution regions with .ANY selector matching interface.o(.data).
..\OBJ\TOUCH.axf: Error: L6406E: No space in execution regions with .ANY selector matching startup_stm32f10x_hd.o(STACK).
..\OBJ\TOUCH.axf: Error: L6406E: No space in execution regions with .ANY selector matching startup_stm32f10x_hd.o(HEAP).
..\OBJ\TOUCH.axf: Error: L6406E: No space in execution regions with .ANY selector matching usart.o(.bss).
..\OBJ\TOUCH.axf: Error: L6406E: No space in execution regions with .ANY selector matching libspace.o(.bss).
..\OBJ\TOUCH.axf: Error: L6406E: No space in execution regions with .ANY selector matching touch.o(.data).
..\OBJ\TOUCH.axf: Error: L6406E: No space in execution regions with .ANY selector matching system_stm32f10x.o(.data).
..\OBJ\TOUCH.axf: Error: L6406E: No space in execution regions with .ANY selector matching stm32f10x_rcc.o(.data).
..\OBJ\TOUCH.axf: Error: L6406E: No space in execution regions with .ANY selector matching lcd.o(.bss).
..\OBJ\TOUCH.axf: Error: L6406E: No space in execution regions with .ANY selector matching usart.o(.data).
..\OBJ\TOUCH.axf: Error: L6406E: No space in execution regions with .ANY selector matching lcd.o(.data).
..\OBJ\TOUCH.axf: Error: L6406E: No space in execution regions with .ANY selector matching delay.o(.data).
..\OBJ\TOUCH.axf: Error: L6406E: No space in execution regions with .ANY selector matching ft5206.o(.data).
..\OBJ\TOUCH.axf: Error: L6407E: Sections of aggregate size 0x1673c bytes could not fit into .ANY selector(s).
Not enough information to list image symbols.
Not enough information to list the image map.
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-29 05:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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