2013-08-21 66 views
5

Tôi đang sử dụng FreeRTOS V6.1.1 trên STM32F107VC và gặp lỗi malloc thường xuyên. Diện tích đống được định nghĩa trong kịch bản mối liên kết nhưng nó vẫn tiếp tục bị mắc kẹt trong vòng lặp này pvPortMalloc() sau một vài phân bổ:Lỗi phân bổ FreeRTOS

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

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

linker script:

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

... 

Làm thế nào điều này có thể?

+0

Trông giống như sự cố tràn ngăn xếp, bạn đã thử tăng ngăn xếp chưa !? – Ishmeet

+0

Bạn có nghĩa là _Min_Stack_Size? Tôi đã thử nó ngay bây giờ mà không thành công. Tệp liên kết này cũng được sử dụng trong các dự án lớn hơn và hoạt động tốt. – RootRaven

+0

Bạn đang sử dụng phiên bản nào của heap? Heap_1.c, heap_2.c hoặc heap_3.c? Một số phiên bản phân mảnh và sẽ không hoạt động nếu bạn phân bổ và giải phóng khối bộ nhớ với các kích thước khác nhau. –

Trả lời

2

Điều này có thể do phân mảnh trong heap_2.c. Mặc dù phân bổ khá nhỏ, nhưng hành vi là nhất quán. Sử dụng heap_4.c đã giải quyết nó.

+0

Tôi đang tạo một ứng dụng mà tôi sẽ phân bổ và giải phóng rất nhiều khối bộ nhớ để lưu trữ các chuỗi được tạo động có kích thước biến. Dựa trên những gì tôi học ở đây thì có nên sử dụng heap_4.c không? – m4l490n

+0

Có, nếu không các khối được phân bổ này có thể quá nhỏ đối với các chuỗi lớn hơn trong tương lai, dẫn đến ngoại lệ OutOfMemory mặc dù có đủ không gian trống. – RootRaven

Các vấn đề liên quan