2013-08-21 9 views
5

Ich verwende FreeRTOS V6.1.1 auf einem STM32F107VC und bekomme häufige malloc Fehler. Der Heap-Bereich ist in der Linker-Skript definiert, aber es hält in dieser Schleife von pvPortMalloc() nach einigen Zuteilungen stecken:FreeRTOS Zuordnungsfehler

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

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

Linker-Skript:

/* 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 
} 

... 

Wie kann das sein?

+0

Sieht aus wie ein Stack-Überlauf-Problem, haben Sie versucht, den Stack zu erhöhen !? – Ishmeet

+0

Sie meinen _Min_Stack_Size? Ich habe es jetzt ohne Erfolg versucht. Diese Linker-Datei wurde auch in größeren Projekten verwendet und funktionierte gut. – RootRaven

+0

Welche Version des Heap verwenden Sie? Heap_1.c, heap_2.c oder heap_3.c? Einige Versionen werden fragmentiert und funktionieren nicht, wenn Sie Speicherblöcke mit unterschiedlichen Größen zuweisen und freigeben. –

Antwort

2

Dies wurde wahrscheinlich durch die Fragmentierung in heap_2.c verursacht. Obwohl die Zuweisungen ziemlich klein waren, war das Verhalten konsistent. Die Verwendung von heap_4.c hat es gelöst.

+0

Ich mache eine Anwendung, wo ich viele Speicherblöcke zuweisen und freigeben werde, um dynamisch erzeugte Strings variabler Größe zu speichern. Basierend auf dem, was ich hier lerne, ist es empfehlenswert, heap_4.c zu verwenden? – m4l490n

+0

Ja, andernfalls sind diese zugewiesenen Blöcke in Zukunft möglicherweise zu klein für größere Strings, was zu einer OutOfMemory-Ausnahme führt, obwohl genügend Speicherplatz frei ist. – RootRaven

Verwandte Themen