FreeRTOS 分配错误

5

我正在使用FreeRTOS V6.1.1在STM32F107VC上,经常出现内存分配错误。堆区域在链接脚本中定义,但在几次分配后,它一直卡在pvPortMalloc()的循环中:

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
}

...

这怎么可能呢?

似乎是堆栈溢出问题,您尝试增加堆栈大小了吗? - Ishmeet
我使用了heap_2,我认为RAM太过分散。即使新的分配相对较小。 - RootRaven
1
在实时固件中,内存碎片化是不使用malloc/free的一个很好的理由。当然,如果您正在使用遗留代码,可以在初始化期间使用malloc并永远不调用free - Mark Lakata
确实如此。但是由于我接收到多个不同大小的串行数据包,我并没有看到更好的替代方案。 - RootRaven
你可以将它们写入固定的(环形)缓冲区并加上一些帧。或者可能使用FreeRTOS消息队列。 - XTL
显示剩余3条评论
1个回答

2

这可能是由heap_2.c中的碎片化引起的。尽管分配的空间很小,但行为是一致的。使用heap_4.c解决了这个问题。


我正在制作一个应用程序,其中我将分配和释放大量的内存块来存储动态生成的不同大小的字符串。根据我在这里学到的知识,是否建议使用heap_4.c? - m4l490n
否则分配的这些块可能对于将来较大的字符串来说太小,导致 OutOfMemory 异常,即使有足够的空间也无法满足。 - RootRaven

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接