STM32 硬故障免费

STM32 hardfault at free

我正在使用 STM32L476(没有 FreeRTOS)开发应用程序。我正在使用 SW4STM32 和 STM32CubeMx。我在我的应用程序中使用带有 Fatfs 的 SDMMC。目前,我在释放内存时遇到硬故障。

根据linker 文件

,这些是我的堆栈和堆详细信息
/* 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是崩溃的地址(就是我释放的地址)

我尝试按照此 link Cortex-M3 Hard Fault - find cause

来调试问题

这是我在硬故障时得到的结果:

SCB->HFSR = 0x40000000
Forced Hard Fault
SCB->CFSR = 0x00008200

但我无法得出任何结论

像这样的硬故障 - 在 free 甚至 malloc - 通常表明你的内存在某种程度上被破坏了。最常见的原因是在同一内存地址上加倍 free 或覆盖内存中的数据,例如写到某种缓冲区的末尾。

关于第二点 - 虽然这取决于实现 - malloc 的一般方法是存储一些额外的信息,供将来调用 mallocfree 时在内部使用.这些是实际分配的块的大小,有关内存中下一个块的信息等。我检查过的实现中的这些信息存储在您作为 return 值给出的内存地址之前malloc。如果您随后覆盖此数据 - 例如通过写入在该地址之前分配的缓冲区 - 下一次释放此内存的 free 调用将以意外方式失败,通常会导致 HardFault.

话虽如此,鉴于您提供的信息有限,我所能建议的是检查将数据写入内存的代码 - 主要是将代码写入分配给 malloc 的数组。将代码限制为仍然会导致 HardFault 的最小情况并对其进行调试。可能设置一些数据断点(写入)。 free 释放内存时失败可能并不一定(在这种情况下,它可能不会)一定表示内存的特定部分有问题,而是相邻的内存部分有问题。