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

2019-10-15 20:18发布

本人在使用 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差别在哪里。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
22条回答
aozima
1楼-- · 2019-10-16 17:56
[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]
777ai77
2楼-- · 2019-10-16 20:22
jinggx 发表于 2016-12-27 22:18
我答非所问,那请你来回答!

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

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

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

那HEX文件中描述bin文件的差别在哪里。
aozima
3楼-- · 2019-10-16 23:41
本帖最后由 aozima 于 2016-12-28 10:11 编辑

自己仔细对比MAP文件呀。

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

但有一种可能就是:
MDK的链接器应该有压缩功能的,所以当没有const时,虽然占用RAM大,但RO中的init却可以压缩,所以出来的镜像比较小。
而有const时,就不能压缩了,所以镜像会大。
zc123
4楼-- · 2019-10-17 04:29
本帖最后由 zc123 于 2016-12-28 10:46 编辑
777ai77 发表于 2016-12-28 10:04
我比较好奇的还是 hex文件里多了什么东西, 数据量我说错了, 数据量是 45000B 。

反正不管加不加cons ...

hex里面包含的信息和bin其实是一样的,只是换了一种存储方式而已。我是写过一个hex和bin互转的小脚本才明白的。
至于大小为什么不一样的原因是基本上是keil的优化
被定义为const的变量是一定会写入到生成的代码中的,
而只定义未被调用的全局变量keil会优化掉,不是压缩,而是这个变量被删除了,如果想让代码大小一致,可以程序里添加个print(a),就可以看到一样了
777ai77
5楼-- · 2019-10-17 07:21
 精彩回答 2  元偷偷看……
zc123
6楼-- · 2019-10-17 08:28
777ai77 发表于 2016-12-28 10:56
我上述的程序里头,确实调用到这个全局变量,并没有优化掉。

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

一周热门 更多>