2013-08-21 44 views
5

我在STM32F107VC上使用FreeRTOS V6.1.1並且頻繁出現malloc錯誤。堆區在鏈接腳本定義,但少數的分配後,一直陷在這個循環pvPortMalloc()的:FreeRTOS分配錯誤

while((pxBlock->xBlockSize < xWantedSize) && (pxBlock->pxNextFreeBlock != NULL)) 
{ 
    pxPreviousBlock = pxBlock; 
    pxBlock = pxBlock->pxNextFreeBlock; 
} 

pxBlock: 0x20002300 
pxPreviousBlock: 0x20002300 
pxNewBlockLink: 0x00 
xHeapHasBeenInitialised: 0x01 

鏈接腳本:

/* Entry Point */ 
ENTRY(Reset_Handler) 

/* Highest address of the user mode stack */ 
_estack = 0x20010000; /* end of 64K RAM */ 

/* Generate a link error if heap and stack don't fit into RAM */ 
_Min_Heap_Size = 0;  /* required amount of heap */ 
_Min_Stack_Size = 0x200; /* required amount of stack */ 

/* Specify the memory areas */ 
MEMORY 
{ 
    FLASH (rx)  : ORIGIN = 0x08000000, LENGTH = 256K 
    RAM (xrw)  : ORIGIN = 0x20000000, LENGTH = 64K 
    MEMORY_B1 (rx) : ORIGIN = 0x60000000, LENGTH = 0K 
} 

... 

怎麼能這樣呢?

+0

看起來像堆棧溢出問題,你有沒有嘗試增加堆棧!? – Ishmeet

+0

你的意思是_Min_Stack_Size?我現在嘗試它沒有成功。這個鏈接器文件也用於較大的項目並且工作正常。 – RootRaven

+0

您使用的是哪個版本的堆? Heap_1.c,heap_2.c或heap_3.c?某些版本正在分片,如果您分配和釋放不同大小的內存塊,將無法工作。 –

回答

2

這可能是由heap_2.c中的碎片引起的。即使分配很小,行爲也是一致的。使用heap_4.c解決了它。

+0

我正在做一個應用程序,我將分配和釋放大量的內存塊來存儲動態生成的可變大小的字符串。根據我在這裏學到的東西,建議使用heap_4.c? – m4l490n

+0

是的,否則這些分配的塊可能對於未來較大的字符串而言太小,導致OutOfMemory異常,即使有足夠的空間。 – RootRaven