Embedded 解释Cortex M4硬故障错误调试信息

Embedded 解释Cortex M4硬故障错误调试信息,embedded,microcontroller,keil,cortex-m,nxp-microcontroller,Embedded,Microcontroller,Keil,Cortex M,Nxp Microcontroller,对不起,这太长了!我相信我会得到一些TL;DRs:/ 我对皮质M3/4的世界一点也不陌生;我在过去遇到过很多硬错误,毫无例外,它们都是由于FreeRTOS上的堆栈溢出造成的。然而,在这种情况下,我真的很难找到一个系统上的硬故障,这个系统有别人的旧代码,我稍微修改了一下 我有一个带有LCD和触摸屏的系统。我们有了新的硬件,除了从LPC1788变为等效的LPC4088,触摸屏是I2C而不是SPI之外,它几乎与旧硬件相同 我使用Keil UVIEW(这是新的),它是一个MX4内核,是Keil RL A

对不起,这太长了!我相信我会得到一些TL;DRs:/

我对皮质M3/4的世界一点也不陌生;我在过去遇到过很多硬错误,毫无例外,它们都是由于FreeRTOS上的堆栈溢出造成的。然而,在这种情况下,我真的很难找到一个系统上的硬故障,这个系统有别人的旧代码,我稍微修改了一下

我有一个带有LCD和触摸屏的系统。我们有了新的硬件,除了从LPC1788变为等效的LPC4088,触摸屏是I2C而不是SPI之外,它几乎与旧硬件相同

我使用Keil UVIEW(这是新的),它是一个MX4内核,是Keil RL ARM RTOS(也是新的我),它使用C/C++混合,C++也不是我有很多经验的。除此之外,还有Segger emWin(我从未使用过)封闭源代码,它似乎总是崩溃。它将渲染几个屏幕,读取触摸屏按钮等,然后倒下。但有时它会立刻倒下

我遵循了这一点:

我在下面附上了调试器/IDE崩溃时的图片(单击放大)

当它崩溃时,操作系统中突出显示的绿色任务毫无例外是ApplicationTask(我没有修改)

如果我读取的信息正确,Keil uvision调试器会告诉我使用的堆栈是MSP堆栈,地址为0x20003238。下面有一个内存转储:

如果我理解正确,这意味着R0、2、3和12为0,程序计数器与LR和PSR一样为0。但是,这与第一张图片中的“调用堆栈+局部变量”窗口中的内容相反。如果我右键单击ApplicationTask:4下面的0x00005A50并选择caller code,它会告诉我它是

BL.W GUI_ALLOC_UnlockH
我想这是在emWin二进制blob中

但是,如果我看0x20001B60(这是PSP堆栈值),如下所示:

这似乎与调用堆栈+本地窗口告诉我的情况吻合得更好。它似乎还告诉我,它在emWin中崩溃了,大量的谷歌搜索显示,塞格总是彻底洗手不干他们封闭的源代码可能出错的任何可能性。公平地说,在我将代码修改为使用I2C触摸屏界面而不是SPI之前,它不太可能正常工作。然而,它崩溃(或者看起来崩溃)的地方与我修改的代码无关

此外,此窗口位于下面:

将BFAR地址指定为0xF00B4DDA,将内存管理器故障地址指定为0xF00B4DDA。我不知道我是否应该将此解释为问题所在

我在网上找到了一些其他的帖子,包括一篇关于堆栈溢出(stackoverflow)的类似文章(但都没有与之相关的解决方案),其中人们也有同样的问题

因此,我的问题是:

  • 我是否正确阅读了这些数据并理解了我链接的Keil文档?我真的觉得我一定是错过了MSP/PSP的问题

  • 我是否正确地将调用方代码函数与uvision一起使用?我右键单击ApplicationTask:4下面的Call Stack+Locals'address,它似乎总是把我带到一些我无法检查的Segger代码,这肯定不是问题所在

  • 我真的应该将该问题作为总线故障地址读取,并尝试读取或写入0xF00B4DDA(保留空间)

  • 我尝试实现一段代码,如下所示:


  • 但这只会使整个系统停止正常运行,并在某些init代码中以at-BKPT指令结束。最重要的是,我不相信这类东西会比uvision告诉我更多,除了它显示我稍微快一点,而且不费吹灰之力。我的后一种假设正确吗?

    调用堆栈等可能不太相关。1) 在硬故障处理程序上放置断点。2) 一直跑到撞车。3) 看看指令跟踪。这并不是回答了直接解释硬故障信息的问题,而是我怀疑堆栈溢出或缓冲区溢出会导致内核在杂草中脱落,从而使硬故障信息几乎毫无用处。扩大你所有的堆叠(如果可以的话)和/或在它们周围设置围栏。然后做一些类似于您正在使用的阵列的操作。另一个选择(更痛苦的是)是在崩溃前后进行内存转储,然后使用一个工具进行区分,该工具可以让您筛选出预期的差异,并可能了解出了什么问题。祝你好运你真的可以回到旧的SPI代码,它似乎在你的新硬件上工作得很好吗?如果是这样的话,请仔细看一下您所更改的内容—I2C代码和中断处理程序—以了解所需的副作用/堆栈深度。是的,放大堆叠看看是否有任何效果。我在绝望和怀疑堆栈时使用的另一个技巧是确保在一切开始之前将RAM归零,然后在崩溃后查看堆栈的内存区域,并查看非零内存到底有多远,因为这反映了实际使用的最大堆栈深度。感谢您的建议。我已经尝试过将堆栈大小增加100字节,但没有任何区别(我确信我已经写了,但是我重写了很多次,我都没有跟上)。我会去尝试旧的SPI代码,可能还会尝试插入一些虚拟按键,因为它从一个屏幕切换到另一个屏幕,这似乎真的会使它崩溃。事实证明,这是SDRAM上的数据总线问题。其中两条线路没有正确连接。唉。不过,我确实认为了解原始问题的答案会很有用,以备将来参考。