打印

const 变量占用空间问题

[复制链接]
4195|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
最近在2440开发板上调试一个裸机程序,在LCD显示部分,要显示一张图片,因此将图片编码定义成const 数组,定义在一个文件,总大小100k,编译的时候发现const 变量实际上是编译到了RO区域,如图

因此有一个问题,bin文件烧录到flash 中,当arm 开始运行的时候,会将CODE RO
以及RW的内容都load ram 中,那这样那个const 数组不是要占用很大的ram空间吗?如果这样的话,图片多几张不是ram就不够用了???
51中,我们有用code 关键字,将这样的数据定义到rom 区间,为了节省ram空间,那我想问是如何节省的?51中就不会loadram中执行吗?  arm中要怎样达到节省ram空间的目的呢?
这个问题困扰了好几天,请高手指点!!!

相关帖子

沙发
xinzha| | 2011-12-23 21:58 | 只看该作者
把显示图像的地方做成指针的方式,当需要显示的时候,把图像数据从flash中读出来,不需要的时候将空间释放给其他程序使用。

使用特权

评论回复
板凳
elec.so| | 2011-12-24 11:12 | 只看该作者
你用什么开发环境?把数组定义到位于FLASH的某段中,如果没有这种段,可以通过编辑连接脚本之类的文件自定义这种段。

使用特权

评论回复
地板
andy_huang|  楼主 | 2011-12-24 16:16 | 只看该作者
如果用指针如何定义?编译之后编码在程序的哪个区? RO,RW ?如果在这两个区那还是要load进去

使用特权

评论回复
5
andy_huang|  楼主 | 2011-12-24 16:17 | 只看该作者
2# xinzha

如果用指针如何定义?编译之后编码在程序的哪个区? RO,RW ?如果在这两个区那还是要load进去

使用特权

评论回复
6
andy_huang|  楼主 | 2011-12-24 16:18 | 只看该作者
3# elec.so

我用的是ADS 1.2, 把数组定义到flash 某个区是指类似keil 里 的修改start.s文件吗?

使用特权

评论回复
7
xinzha| | 2011-12-24 20:30 | 只看该作者
把scatter,loader和flash tool配合起来,完全可以做到,不同平台可以用不一样的方法,没有一定的做法。

使用特权

评论回复
8
zengfan155| | 2011-12-25 20:26 | 只看该作者
两种方法:因为你要把CODE数据加载到RAM运行,所以首先需要把CODE数据和图像RO数据分开存放在FLASH里面,等程序boot的时候只复制CODE数据到RAM里面。
第一种方法比较简单:
如果你是用Jlink仿真器,它自带一个烧写文件到flash的功能。你首先将图像文件单独编译产生bin文件,然后使用这个软件将你的图像数据烧写到指定的flash位置,只要该位置不与code冲突即可。当然你程序需要访问图像的时候,采用指针指向这个固定的flash位置。
软件工程里面不再需要带图像的const编译,只有软件代码,到时只复制这部分到RAM。
第二种方法比较复杂:
1.在定义图像数组的时候,先采用#pragma arm section rodata = "name"与#pragma arm section给你的const数据重新定义一个新的名称"name",这样可以在分散加载描述文件单独给这个段指定flash地址。
2.编辑你的分散加载描述文件,在文件里面指定CODE和const数据到你想要存储的FLASH位置,这样,以后只需要复制CODE到RAM里面。
对于你的需求来说,这两种方法达到的效果是一样的。但是第二种方法更灵活,可以对ADS中所有具有链接符号的代码、全局变量指定任意的存储位置。

使用特权

评论回复
9
zengfan155| | 2011-12-25 20:33 | 只看该作者
有点小问题,采用#pragma arm section可以对一个文件中不同的数据声明不同的段,这样可以将这些不同的段链接到不同的地址。如果你的文件里面就只有图像的const数据,那么可以不需要#pragma arm section。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

40

帖子

1

粉丝