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

时间:2017-07-06 09:02:02

标签: embedded microcontroller keil cortex-m nxp-microcontroller

抱歉 - 这很长!我相信我会得到一些TL; DR。 :/

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

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

我正在使用Keil uvision(对我来说是新手)和NXP4088是一个M4核心和Keil RL-ARM RTOS(也是我的新手),它使用的是C / C ++混合,C ++也不是我的东西有很多经验。除此之外,还有Segger emWin(我从未使用过)封闭源代码,它似乎总是崩溃。它将呈现几个屏幕,阅读触摸屏按钮等然后摔倒。有时它会立即倒下。

我跟着这个:

http://www.keil.com/appnotes/files/apnt209.pdf

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

enter image description here

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

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

enter image description here

如果我理解正确,这意味着R0,2,3和12为0,程序计数器为0,LR和PSR为0。但是,这与第一张图片中Call Stack + Locals窗口中的内容不符。如果我右键单击ApplicationTask:4下面的0x00005A50并选择调用者代码,它就会告诉我它是

BL.W GUI_ALLOC_UnlockH

我认为这是在emWin二进制blob中。

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

enter image description here

这似乎与Call Stack + Local Window告诉我的内容相比好多了。它似乎也告诉我它在emWin中崩溃并且广泛的谷歌搜索显示,Segger总是完全洗手他们的封闭源代码可能有错。公平地说,在我修改代码以使用I2C触摸屏界面而不是SPI之前,它不太可能正常工作。然而,它崩溃(或似乎是)与我修改的代码无关。

此外,此窗口如下:

enter image description here

将BFAR地址设置为0xF00B4DDA,将内存管理器故障地址设置为0xF00B4DDA。我不知道我是否应该解释这个问题。

我在网络上发现了一些其他帖子,其中包括一个与Stack Overflow相似的文章(但都没有与之相关的解决方案),人们有同样的问题。

所以,我的问题是:

  1. 我是否正确阅读了这些数据并理解了我链接到的Keil文档?我真的觉得我必须遗漏这个MSP / PSP问题。

  2. 我是否正确使用了uvision的来电代码功能?我在ApplicationTask:4下面右键点击Call Stack + Locals的地址,它似乎总是带我去看一些我无法检查的Segger代码,肯定不是什么错误。

  3. 我是否真的将该问题作为总线故障地址读取,试图读取或写入0xF00B4DDA这是预留空间?

  4. 我尝试实现一段代码,如:

  5. https://blog.frankvh.com/2011/12/07/cortex-m3-m4-hard-fault-handler/

    但是这只会阻止整个系统正常运行,并在某些初始化代码中以BKPT指令结束。除此之外,我不相信这种事情会告诉我任何比uvision更多的事情,除了它让我显得更快,没有努力。我是否适合后一种假设?

0 个答案:

没有答案