Arm cortex-M4因硬故障而崩溃

Arm cortex-M4因硬故障而崩溃,arm,gnu,Arm,Gnu,我们得到一个异常,lr是0xFFFFFFF1。这意味着我们必须cmp msp和psp。地址现在是0x2000E8D0。这是堆栈指针 比我得到: printf(" - Forced Hard fault.\n") printf(" - MMAR holds an invalid address.\n"); printf(" - BFAR holds an invalid address.\n"); printf(" - Atte

我们得到一个异常,lr是0xFFFFFFF1。这意味着我们必须cmp msp和psp。地址现在是0x2000E8D0。这是堆栈指针

比我得到:

printf(" - Forced Hard fault.\n")
printf(" - MMAR holds an invalid address.\n");
printf(" - BFAR holds an invalid address.\n");
printf(" - Attempted to execute an instruction that makes illegal use of the EPSR.\n");
printf(" - The processor has attempted to execute an undefined instruction.\n");
我现在可以做些什么来进一步捕捉错误?我解释了堆栈指针周围的一些值,但找不到任何错误提示


程序在从IRQ调用的函数之后运行。

您可以使用常规调试技术,在向前的方向上缩小导致故障的代码范围,也可以从故障向后运行。lr值仅表示您在处理程序中,这也意味着如果转储堆栈,您将看到一组信息,包括导致故障的指令地址或其附近的信息。阅读arm文档以查看堆栈中的确切内容,当您看到转储与文档时,应该很容易将其对齐。您确实没有提供任何信息来帮助。该代码区域的错误反汇编地址,以及假设编译后生成的高级代码,等等。有了这些信息,应该很容易看到错误。只有当所有代码都是代码时,这才很容易。我们有很多硬件配置。SPI/UART数据存取协议。我发现这是一个DMA配置问题。你可以使用普通的调试技术来缩小导致故障的代码的前向范围,也可以从故障中反向工作。lr值仅表示您在处理程序中,这也意味着如果转储堆栈,您将看到一组信息,包括导致故障的指令地址或其附近的信息。阅读arm文档以查看堆栈中的确切内容,当您看到转储与文档时,应该很容易将其对齐。您确实没有提供任何信息来帮助。该代码区域的错误反汇编地址,以及假设编译后生成的高级代码,等等。有了这些信息,应该很容易看到错误。只有当所有代码都是代码时,这才很容易。我们有很多硬件配置。SPI/UART数据存取协议。我发现了,这是一个DMA配置问题。