我正在使用STM32L476(没有FreeRTOS)开发应用程序。我正在使用SW4STM32和STM32CubeMx。我在我的应用程序中将SDMMC与Fatfs一起使用。当前,释放内存时出现了硬故障。
这些是我每个链接器文件的堆栈和堆详细信息
/* Highest address of the user mode stack */
_estack = 0x20018000; /* end of RAM */
/* Generate a link error if heap and stack don't fit into RAM */
_Min_Heap_Size = 0x7E20; /* required amount of heap */
_Min_Stack_Size = 0x1FA0; /* required amount of stack */
0x20003248
是发生崩溃的地址(是我要释放的地址)
我尝试通过以下链接Cortex-M3 Hard Fault - find cause
调试问题这就是我遇到的硬故障:
SCB->HFSR = 0x40000000
Forced Hard Fault
SCB->CFSR = 0x00008200
但是我什么都不能结论
答案 0 :(得分:1)
在free
甚至malloc
中的此类HardFault通常表示您的内存以某种方式损坏了。最常见的原因是在相同的内存地址上加倍free
或覆盖内存中的数据,例如写过某种缓冲区的末尾。
关于第二点-尽管这取决于实现-malloc
的一般方法是存储一些内部使用的其他信息,以供将来对malloc
或free
的调用。这些是诸如实际分配的块的大小,有关内存中的下一个块的信息等。我检查过的实现中的此信息存储在您作为{{1}的返回值给定的内存地址之前}。如果您随后覆盖此数据(例如,通过写入在该地址之前分配的缓冲区),则对释放该内存的malloc
的下一次调用将以意外的方式失败,通常会导致HardFault。>
话虽如此,鉴于您所提供的信息有限,我只能建议您看一下将数据写入内存的代码-大多数情况是将代码写入分配给free
的数组。将代码限制在仍然会导致HardFault的最小情况下并对其进行调试。可能设置一些数据断点(写)。 malloc
在释放内存时失败可能不会(并且在这种情况下,可能并不一定)表示该内存的特定部分有问题,而是相邻的一部分。