tanbin 发表于 2012-2-27 17:22:41

请问malloc的问题

请问在UCOS中如果更改malloc的大小限制?
CPU是L138,RAM为32MB的DDR2,分配给数据段为24MB,操作系统为UCOS。
在一个任务中malloc(2048),结果返回失败,改为malloc(1600),则返回成功,此任务的堆栈尺寸已经设置为32KB。
malloc的大小限制由谁控制?操作系统还是编译器?
因为malloc是C的标准库,所以我认为应该是编译器的问题。
但如果是由UCOS操作系统决定,那请问在哪里更改?
谢谢!

yfpbird 发表于 2012-2-27 17:32:31

首先,堆和栈是有区别的,malloc是从堆里面分配空间的,一般也就是从heap空间分配的。
在ucos下有一部分内存管理,在这个里面应该也会有模拟内存动态分配的内容(这个没研究过,是猜的)。
这么大容量的RAM,势必要做内存管理的。

theophilus 发表于 2012-2-27 21:34:09

所以说发明“堆栈”这个词的该拖出去TJJTDS.

ucos有自己的内存管理,但是需要自己划分一段内存供它使用,其实就是一个内存池。
malloc是编译器实现。

tanbin 发表于 2012-2-28 14:13:44

谢谢楼上的兄弟。
不过还是没有搞明白在哪里修改,能够解决malloc(2048)失败。
还请高手教一教。谢谢!

yfpbird 发表于 2012-2-29 16:59:20

回复【3楼】tanbin
-----------------------------------------------------------------------

看你用什么编译器,针对不同的编译器修改堆的大小

gold 发表于 2012-2-29 17:02:10

3个byte你也去malloc,有这个必要吗?直接在栈里不就可以了
仔细去看看malloc的函数,malloc用多了就会出现申请失败的情况
举个例子,假如有一个210字节的堆,如果你malloc 200的话会成功,但如果你malloc 100后free,此时再malloc 200就会失败
所以malloc失败要么是内存不足,要么是内存碎片,也就是不连续造成的。
LZ的malloc失败和任务的任务栈大小没有关系,任务的任务栈是全局变量,没必要给32K

malloc是在运行阶段分配的,不是编译阶段实现的。

另:如果是ucos,可以用它自带的内存管理,不会产生上述的内存碎片问题

yfpbird 发表于 2012-2-29 17:21:29

回复【6楼】gold
-----------------------------------------------------------------------
关于malloc会产生内存碎片的问题倒是一直没有关注过,有空试一下。针对这种内存碎片有没有什么解决的方法?

gold 发表于 2012-2-29 18:07:40

回复【7楼】yfpbird
回复【6楼】gold   
-----------------------------------------------------------------------
关于malloc会产生内存碎片的问题倒是一直没有关注过,有空试一下。针对这种内存碎片有没有什么解决的方法?

-----------------------------------------------------------------------

不用标准的就是了,如果没有OS,我是申请一个全局数组作为共享缓存来使用的,注意中断和其他函数之间别冲突就是了

tabing 发表于 2012-3-1 00:26:39

楼主的ID跟我的好像。。。

tanybin 发表于 2012-3-1 09:00:53

回复【9楼】tabing
-----------------------------------------------------------------------

应该是和我的比较像吧,呵呵。
页: [1]
查看完整版本: 请问malloc的问题