对不起 - 这很长!我确定我会得到一些 TL;DR。:/
我对 Cortex M3/4 的世界一点也不陌生。过去我遇到过很多硬故障错误,无一例外都是由于 FreeRTOS 上的堆栈溢出造成的。但是,在这种情况下,我真的很难在一个系统上找到一个硬故障,该系统有我稍微修改过的其他人的旧代码。
我有一个带 LCD 和触摸屏的系统。我们有新硬件,除了从 LPC1788 变为等效的插入式 LPC4088 并且触摸屏是 I2C 而不是 SPI 之外,它几乎与旧硬件相同。
我正在使用 Keil uvision(对我来说是新的)和一个 M4 内核的 NXP4088 和使用 C/C++ 混合的 Keil RL-ARM RTOS(对我来说也是新的),C++ 也不是我有太多经验的东西和。除此之外,还有 Segger emWin(我从未使用过)封闭源代码,它似乎总是在崩溃。它会渲染几个屏幕,读取触摸屏按钮等,然后摔倒。有时它会立即倒下。
我遵循了这个:
http://www.keil.com/appnotes/files/apnt209.pdf
我附上了调试器/IDE 在下面崩溃时的图片(点击放大)。
当它崩溃时,操作系统中突出显示的绿色任务无一例外是 ApplicationTask(我没有修改)。
如果我正确读取信息,Keil uvision 调试器会告诉我正在使用的堆栈是地址为 0x20003238 的 MSP 堆栈。下面有一个内存转储:
如果我理解正确,这意味着 R0、2、3 和 12 为 0,程序计数器为 0,LR 和 PSR 也是。但是,这与第一张图片中的 Call Stack + Locals 窗口中的内容背道而驰。如果我右键单击 ApplicationTask:4 下的 0x00005A50 并选择调用者代码,它告诉我它是
BL.W GUI_ALLOC_UnlockH
我认为这是在 emWin 二进制 blob 中。
但是,如果我查看 0x20001B60 (这是PSP堆栈值),如下所示:
这似乎与 Call Stack + Local Window 告诉我的相符得多。它似乎也告诉我它在 emWin 中崩溃了,并且广泛的谷歌搜索显示 Segger 总是完全不考虑他们的封闭源代码可能有问题的任何可能性。公平地说,在我修改代码以使用 I2C 触摸屏界面而不是 SPI 之前,它不太可能正常工作。但是,它在哪里崩溃(或似乎是)与我修改的代码无关。
此外,下面的这个窗口:
将 BFAR 地址指定为 0xF00B4DDA,将内存管理器故障地址指定为 0xF00B4DDA。我不知道我是否应该将其解释为问题所在。
我在网络上找到了其他一些帖子,其中一个与 Stack Overflow 上的帖子惊人地相似(但都没有与之相关的解决方案),人们也有同样的问题。
所以,我的问题是:
我是否正确阅读了这些数据并理解了我链接到的 Keil 文档?我真的觉得我一定错过了这个 MSP/PSP 问题。
我是否正确使用带有uvision的调用者代码功能?我右键单击 ApplicationTask:4 下面的 Call Stack + Locals 地址的那一点,它似乎总是把我带到一些我无法检查的 Segger 代码,当然这不是问题所在。
我真的应该将问题作为总线故障地址来读取,并尝试读取或写入保留空间的 0xF00B4DDA 吗?
我尝试实现一段代码,例如:
https://blog.frankvh.com/2011/12/07/cortex-m3-m4-hard-fault-handler/
但这只会阻止整个系统正常运行,并在一些初始化代码中以 BKPT 指令结束。最重要的是,我不相信这种事情会比 uvision 告诉我更多,除了它显示我稍微快一点并且零努力。我在后一个假设中是对的吗?