免费提供STM32 Hardfault

时间:2018-06-27 07:53:48

标签: c malloc microcontroller free stm32

我正在使用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

但是我什么都不能结论

1 个答案:

答案 0 :(得分:1)

free甚至malloc中的此类HardFault通常表示您的内存以某种方式损坏了。最常见的原因是在相同的内存地址上加倍free或覆盖内存中的数据,例如写过某种缓冲区的末尾。

关于第二点-尽管这取决于实现-malloc的一般方法是存储一些内部使用的其他信息,以供将来对mallocfree的调用。这些是诸如实际分配的块的大小,有关内存中的下一个块的信息等。我检查过的实现中的此信息存储在您作为{{1}的返回值给定的内存地址之前}。如果您随后覆盖此数据(例如,通过写入在该地址之前分配的缓冲区),则对释放该内存的malloc的下一次调用将以意外的方式失败,通常会导致HardFault。

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