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
的一般方法是存储一些额外的信息,供将来调用 malloc
或 free
时在内部使用.这些是实际分配的块的大小,有关内存中下一个块的信息等。我检查过的实现中的这些信息存储在您作为 return 值给出的内存地址之前malloc
。如果您随后覆盖此数据 - 例如通过写入在该地址之前分配的缓冲区 - 下一次释放此内存的 free
调用将以意外方式失败,通常会导致 HardFault.
话虽如此,鉴于您提供的信息有限,我所能建议的是检查将数据写入内存的代码 - 主要是将代码写入分配给 malloc
的数组。将代码限制为仍然会导致 HardFault 的最小情况并对其进行调试。可能设置一些数据断点(写入)。 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
的一般方法是存储一些额外的信息,供将来调用 malloc
或 free
时在内部使用.这些是实际分配的块的大小,有关内存中下一个块的信息等。我检查过的实现中的这些信息存储在您作为 return 值给出的内存地址之前malloc
。如果您随后覆盖此数据 - 例如通过写入在该地址之前分配的缓冲区 - 下一次释放此内存的 free
调用将以意外方式失败,通常会导致 HardFault.
话虽如此,鉴于您提供的信息有限,我所能建议的是检查将数据写入内存的代码 - 主要是将代码写入分配给 malloc
的数组。将代码限制为仍然会导致 HardFault 的最小情况并对其进行调试。可能设置一些数据断点(写入)。 free
释放内存时失败可能并不一定(在这种情况下,它可能不会)一定表示内存的特定部分有问题,而是相邻的内存部分有问题。