第一次使用malloc设置堆内存?

3

我之前遇到了一个bug,现在已经修复了,但我需要在报告中解释一下。

我正在开发一个运行FreeRTOS的嵌入式设备,它有自己的堆内存管理。FreeRTOS有自己的malloc()版本pvPortMalloc(),我之前不知道,使用它可以解决我遇到的内存问题。

我的问题与由malloc()引起的内存溢出的大小有关,数据大小仅为8字节,但溢出的大小相当大,可能是几千字节甚至更大。我的猜测是,在此应用程序中第一次也是唯一一次使用malloc时,它建立了一个至少几kb大小的与FreeRTOS堆竞争的第二个堆。

是否有人能够确认这一点或提供更好的解释?非常感谢提供更多信息或参考资料。


下面的链接比较了FreeRTOS中不同的内存管理方法。讨论了一些关于malloc的已知问题。它可能会对你有所帮助。http://www.freertos.org/a00111.html - Claudi
那是我找出如何修复我的错误的来源,但它并没有解释我观察到的行为。 - Matt Stevens
我的猜测是,在这个应用程序中,malloc的第一次和唯一使用。什么应用程序?请发布代码。否则,问题太广泛,只会导致猜测。 - Lundin
那么,在您切换到pvPortMalloc()之前使用的是哪个版本的malloc()?此外,当应用程序使用malloc()(无论是哪个版本)时,它遇到了什么问题并不清楚。 - Michael Burr
请参考上面的FreeRTOS链接以获取RTOS网站和http://sourceforge.net/projects/freertos/以获取其代码。除此之外,我感兴趣的不是他们的实现方式,而是C编译器的行为。 - Matt Stevens
1个回答

4

许多malloc实现都有一个常见的特点,即从系统中请求比单个请求所需更大的内存块。例如,glibc的ptmalloc就有这种情况:

#define MINIMUM_MORECORE_SIZE  (64 * 1024)

这是从操作系统(通过sbrk())一次性请求内存的最小值(以字节为单位)。因此,您期望看到单个微小分配结果会使用64 KB的内存。

这样做的一个原因是减少系统调用; 另一个原因可能是减少碎片化。


好的,谢谢。这正是我所期望的。它似乎也是FreeRTOS的pvPortMalloc所做的,这可以解释我看到的行为。这个版本的malloc是C89中使用的吗? - Matt Stevens
1
没问题,John。一旦我知道要找什么,寻找glibc代码就相对简单了,我已经找到了你提供的文件。非常感谢你的指引 :-) - Matt Stevens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接