2013-08-21 46 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