我正在开发一个带有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硬故障 - 查找原因
这就是我得到的硬错误:
SCB->HFSR = 0x40000000
Forced Hard Fault
SCB->CFSR = 0x00008200
但我无法得出任何结论
像这样的硬故障 - 在free
甚至malloc
- 通常表示您的内存以某种方式损坏的问题。最常见的原因是对同一内存地址进行双重free
或覆盖内存中的数据,例如写入超过某种缓冲区的末尾。
关于第二点 - 尽管这取决于实现 -malloc
的一般方法是存储一些额外的信息,这些信息在内部用于将来对malloc
或free
的调用。这些是实际分配的块的大小,有关内存中下一个块的信息等。我检查的实现中的此信息存储在您作为malloc
返回值的内存地址之前。如果随后覆盖此数据(例如,通过写入在此地址之前分配的缓冲区(,则下一次调用释放此内存的free
将以意外方式失败,通常会导致硬故障。
话虽如此,鉴于您提供的信息有限,我所能建议的只是浏览将数据写入内存的代码 - 主要是将代码写入分配的数组malloc
.将代码限制为仍会导致硬故障的最小情况并对其进行调试。可能设置一些数据断点(写入(。 释放内存时失败free
可能不一定(在这种情况下,它可能不(表示该特定内存部分存在问题,而是相邻内存部分的问题。