2013-08-21 40 views
5

Używam FreeRTOS V6.1.1 na STM32F107VC i otrzymuję częste błędy malloc. Obszar sterty jest zdefiniowana w skrypcie linkera ale utrzymuje utknięcie w tej pętli pvPortMalloc() po kilku alokacji: skryptBłąd przydziału FreeRTOS

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

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

łącznikową:

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

... 

Jak to może być?

+0

Wygląda na problem z przepełnieniem stosu, czy próbowałeś zwiększyć stos !? – Ishmeet

+0

Masz na myśli _Min_Stack_Size? Wypróbowałem to teraz bez powodzenia. Ten plik łącznika był również używany w większych projektach i działał dobrze. – RootRaven

+0

Z której wersji sterty korzystasz? Heap_1.c, heap_2.c lub heap_3.c? Niektóre wersje są fragmentaryczne i nie będą działać, jeśli przydzielisz i zwolnisz bloki pamięci o różnych rozmiarach. –

Odpowiedz

2

Zostało to prawdopodobnie spowodowane fragmentacją w sterty_2.c. Mimo że alokacje były dość małe, zachowanie było spójne. Użycie heap_4.c rozwiązało to.

+0

Tworzę aplikację, w której przydzielam i zwalniam wiele bloków pamięci, aby przechowywać dynamicznie generowane łańcuchy o różnych rozmiarach. W oparciu o to, czego się tutaj uczę, to czy warto używać heap_4.c? – m4l490n

+0

Tak, w przeciwnym razie te przydzielone bloki mogą być zbyt małe dla większych ciągów w przyszłości, powodując wyjątek OutOfMemory, nawet jeśli jest wystarczająco dużo wolnego miejsca. – RootRaven