2013-08-21 3 views
5

저는 FreeRTOS V6.1.1을 STM32F107VC에서 사용하고 있으며 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