打印

如何在ARM处理器上实现如malloc函数的功能

[复制链接]
5360|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hao01222|  楼主 | 2009-6-26 15:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如何在ARM处理器上实现如malloc函数的功能
标准库中的malloc函数是不需要提前分配好存储空间的,我测试过,一段代码有没有malloc只跟代码段的大小有关,而跟数据段都没有关系的。
但是在ucos和freeRtos里面,类似于malloc函数的实现,都是提前分配好一段固定大小的存储空间,若我代码里面没有使用此函数,这一空间也不能回收利用。
望高手求教 

相关帖子

沙发
hao01222|  楼主 | 2009-6-26 15:06 | 只看该作者

是不是这一块的实现是跟编译器有很大关系?

是不是这一块的实现是跟编译器有很大关系?
不想用malloc就如大家知道的一样,时间不定,容易崩溃,容易产生碎片

所以希望能改写这一块代码,但是在程序中我不知道我的ram具体哪一块是被占用的,哪一块是可以使用的

使用特权

评论回复
板凳
high| | 2009-6-26 15:44 | 只看该作者

省事的话可以弄一个数组自己malloc

我的理解是, heap是c语言库初始化时候指定好位置的. arm平台不是重点, 你用的什么编译器才是重点.

使用特权

评论回复
地板
computer00| | 2009-6-26 16:10 | 只看该作者

编译器作个手脚而已,何必只看表象呢?

你可以在编译器里设置下内存的地址,将一些地址保留起来,拿来做malloc用就可以了,这样编译器得到的结果RW就看不到了。
但是这样有又什么意义呢?多显示点RW就不好了么?

使用特权

评论回复
5
hao01222|  楼主 | 2009-6-26 16:28 | 只看该作者

不是说多分配点地址而已

并不是说多分配点地址而已,因为这是一个底层模块,上层是需要基于此进行写相关的应用,如果底层模块霸占着空间,而导致上层模块必需修改底层代码就不值得了。

对于堆指针的概念不是很熟悉,正在看ARM的malloc实现,其帮助手册上有,等理解了再请教各位

使用特权

评论回复
6
zyboy| | 2009-6-26 17:17 | 只看该作者

世上本无事 庸人自扰之

楼上几位都说的很清楚了。

世上没有无源之水,无本之木。堆,栈,全局区,代码区等等不都是存储空间的一种方式,根据应用的不同场合使用。难道堆的空间可以从天上掉下来。在ARM启动文件中,都可以清楚看到这些空间的分配关系,想看具体一点可以看反汇编,这些空间是如何初始化的,或者map文件。

ARM的栈一般分配在ZI之后,堆一般分配在RAM顶端,当然这些地址初始化地址大小都可以设定。然后让编译器根据这些信息自动去调用就完了。真正的难点在于大小的设置,这些要根据你程序本身使用这些空间的大小有关,堆栈的溢出问题是比较麻烦的

补充飞:堆容易产生内存碎片,,而ucos是基于固定大小存储块,所以不存在这个问题。
周末了,闪人啦。。。。。。。。。

使用特权

评论回复
7
yxwsz| | 2009-6-26 18:43 | 只看该作者

编译器支持

ARM的RVDS支持动态内存分配,前提是实现里面的几个stub函数(retarget.c);
你看看RVDS里面的帮助(chapter 4.3 of DUI0067.pdf)就知道了;

使用特权

评论回复
8
hao01222|  楼主 | 2009-6-29 09:52 | 只看该作者

虽说有点了解,但理解不深

虽说有点了解,但理解不深,希望哪位老大能结合具体某一种我们常用的编译器(如GCC/ARMCC/IARCC),就“随机动态分配”这一块,讲经论道,:-)

使用特权

评论回复
9
dld2| | 2009-6-30 15:08 | 只看该作者

使用特权

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

本版积分规则

17

主题

49

帖子

0

粉丝