请问malloc的问题
请问在UCOS中如果更改malloc的大小限制?CPU是L138,RAM为32MB的DDR2,分配给数据段为24MB,操作系统为UCOS。
在一个任务中malloc(2048),结果返回失败,改为malloc(1600),则返回成功,此任务的堆栈尺寸已经设置为32KB。
malloc的大小限制由谁控制?操作系统还是编译器?
因为malloc是C的标准库,所以我认为应该是编译器的问题。
但如果是由UCOS操作系统决定,那请问在哪里更改?
谢谢! 首先,堆和栈是有区别的,malloc是从堆里面分配空间的,一般也就是从heap空间分配的。
在ucos下有一部分内存管理,在这个里面应该也会有模拟内存动态分配的内容(这个没研究过,是猜的)。
这么大容量的RAM,势必要做内存管理的。 所以说发明“堆栈”这个词的该拖出去TJJTDS.
ucos有自己的内存管理,但是需要自己划分一段内存供它使用,其实就是一个内存池。
malloc是编译器实现。 谢谢楼上的兄弟。
不过还是没有搞明白在哪里修改,能够解决malloc(2048)失败。
还请高手教一教。谢谢! 回复【3楼】tanbin
-----------------------------------------------------------------------
看你用什么编译器,针对不同的编译器修改堆的大小 3个byte你也去malloc,有这个必要吗?直接在栈里不就可以了
仔细去看看malloc的函数,malloc用多了就会出现申请失败的情况
举个例子,假如有一个210字节的堆,如果你malloc 200的话会成功,但如果你malloc 100后free,此时再malloc 200就会失败
所以malloc失败要么是内存不足,要么是内存碎片,也就是不连续造成的。
LZ的malloc失败和任务的任务栈大小没有关系,任务的任务栈是全局变量,没必要给32K
malloc是在运行阶段分配的,不是编译阶段实现的。
另:如果是ucos,可以用它自带的内存管理,不会产生上述的内存碎片问题 回复【6楼】gold
-----------------------------------------------------------------------
关于malloc会产生内存碎片的问题倒是一直没有关注过,有空试一下。针对这种内存碎片有没有什么解决的方法? 回复【7楼】yfpbird
回复【6楼】gold
-----------------------------------------------------------------------
关于malloc会产生内存碎片的问题倒是一直没有关注过,有空试一下。针对这种内存碎片有没有什么解决的方法?
-----------------------------------------------------------------------
不用标准的就是了,如果没有OS,我是申请一个全局数组作为共享缓存来使用的,注意中断和其他函数之间别冲突就是了 楼主的ID跟我的好像。。。 回复【9楼】tabing
-----------------------------------------------------------------------
应该是和我的比较像吧,呵呵。
页:
[1]