2014-09-13 86 views
3

我有一個錯誤,現在我已經修復了,但我需要在報告中解釋。第一次使用malloc設置堆?

我正在運行FreeRTOS的嵌入式設備,它執行自己的堆內存管理。 FreeRTOS有自己的版本malloc(),pvPortMalloc(),我沒有意識到並使用它修復了我遇到的內存問題。

我的問題涉及到由malloc()函數,該數據是在大小隻有8個字節,溢出的大小然而是顯著引起存儲器溢出的大小,千字節,如果不大。我的猜測是,在這個應用程序中第一次也是唯一一次使用malloc,在與FreeRTOS的堆競爭中設置第二個堆,至少有幾個kb的大小。

任何人都可以證實這一點或給出更好的解釋。指向更多信息或引用非常感謝。

+0

下面的鏈接比較了FreeRTOS中不同的內存管理方法。討論了一些關於malloc的已知問題,它可能會幫助你http://www.freertos.org/a00111.html – Claudix 2014-09-13 09:23:22

+0

Ta,這是我找出如何解決我的錯誤的源代碼,但它不能解釋我觀察到的行爲。 – 2014-09-13 09:28:29

+0

「我的猜測是,在這個應用程序中malloc的第一個也是唯一的用途是」什麼應用程序?請發佈代碼。否則,問題太廣泛,只會引發猜測。 – Lundin 2014-09-29 06:36:08

回答

3

它是許多malloc實現的一個共同的特點,從比需要對單個請求的系統請求的存儲器的較大塊。例如,glibc's ptmalloc具有這樣的:

#define MINIMUM_MORECORE_SIZE (64 * 1024) 

這用作下限上的存儲器(以字節爲單位)的量從OS在單一時間請求(經由sbrk())。因此,您希望在64 KB中看到一個微小的分配結果「已使用」。

做這種事情的一個原因是減少系統調用;另一個可能是減少碎片。

+0

好吧,這是我期待的,它似乎是FreeRTOS的pvPortMalloc這個版本的malloc是C89中使用的版本嗎? – 2014-09-29 11:02:14

+1

所有好的John,一旦我知道要尋找什麼,發現glibc代碼是相對直接的,我有找到你提供的文件。非常感謝你的指針:-) – 2014-09-29 11:16:49