C FreeRTOS分配错误
我在STM32F107VC上使用FreeRTOSV6.1.1,经常出现malloc错误。堆区域在链接器脚本中定义,但经过几次分配后,它一直卡在pvPortMalloc()的循环中:C FreeRTOS分配错误,c,malloc,stm32,freertos,C,Malloc,Stm32,Freertos,我在STM32F107VC上使用FreeRTOSV6.1.1,经常出现malloc错误。堆区域在链接器脚本中定义,但经过几次分配后,它一直卡在pvPortMalloc()的循环中: while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) ) { pxPreviousBlock = pxBlock; pxBlock = pxBlock-
while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) )
{
pxPreviousBlock = pxBlock;
pxBlock = pxBlock->pxNextFreeBlock;
}
pxBlock: 0x20002300
pxPreviousBlock: 0x20002300
pxNewBlockLink: 0x00
xHeapHasBeenInitialised: 0x01
这怎么可能呢?这可能是由heap_2.c中的碎片造成的。尽管分配的数额很小,但行为是一致的。使用heap_4.c解决了这个问题。看起来像是堆栈溢出问题,您尝试过增加堆栈吗!?你是说_Min_Stack_大小?我现在试了,但没有成功。这个链接器文件也被用于较大的项目中,并且运行良好。您使用的是哪个版本的堆?堆1.c、堆2.c或堆3.c?有些版本是碎片化的,如果分配和释放不同大小的内存块,则无法工作。我使用了heap_2,我认为ram太碎片化了。尽管新的分配相对较小,但碎片化是不在实时固件中使用malloc/free的一个很好的理由。当然,如果您使用的是旧式代码,您可以在初始化过程中使用
malloc
,并且永远不要调用free
。我正在制作一个应用程序,在这个应用程序中,我将分配和释放大量内存块来存储动态生成的大小可变的字符串。根据我在这里学到的知识,是否建议使用heap_4.c?是的,否则这些分配的块可能太小,将来无法容纳较大的字符串,从而导致OutOfMemory异常,即使有足够的可用空间。
/* 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
}
...