Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C FreeRTOS分配错误_C_Malloc_Stm32_Freertos - Fatal编程技术网

C FreeRTOS分配错误

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-

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

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
}

...