【问题标题】:Finding out the cause of the Hard Fault in lpc1788找出lpc1788硬故障的原因
【发布时间】:2014-05-02 14:49:19
【问题描述】:

我一直在开发一个固件,该固件在lpc1788 上移植了一个沉重的 GUI 库。我使用 32 MB SDRAM 处理字体和图像,使用 NAND 闪存存储字体和 bmp 的二进制文件以及设备配置数据。
我已禁用使用故障、MemManage 故障和总线故障。因此,有时当任何 GUI 功能出现问题时,执行会进入硬故障。现在,我用于 GUI 的库是emWin,我无法知道是什么函数导致了硬故障。如果 NAND 闪存损坏并且库尝试获取要显示的任何内容,例如背景图像,那么它就会出现硬故障。我可以处理这种情况,因为我确定(通过一些带有标志的代码实现)我的 NAND 闪存已损坏,我需要将二进制文件重新编程到其中,因为如果我不这样做,无论何时启动设备起来,它会出现硬故障。
但是,如果某些其他例程导致硬故障,那么我实际上不应该再次重新编程整个闪存。 因此,如果我知道导致硬故障的原因,我将能够相应地修改处理程序,以决定是否需要重新编程或简单地修改一些参数并继续最后一次知道的配置。

有没有办法确定是什么函数导致了运行时硬故障?即使是地址也足够了。这个可以吗?

【问题讨论】:

  • 请注意,答案对任何 Cortex-M3/4 设备都是通用的 - 如果您没有不必要地具体了解特定芯片,您可能会获得更广泛的受众。事实上,您可能不必问;以谷歌“cortex-m hard fault”为例。在大量无关的华夫饼中,这里有一个简短的简单问题。我认为最后一段是删除其余部分。虽然是不相关的部分之一,emWin 与“重型 GUI 库”相反,但 Qt 是一个重型 GUI 库。
  • 通过 SWD 连接的 gdb 能否让它失败?

标签: embedded arm lpc


【解决方案1】:

实现一个报告堆栈寄存器的硬故障处理程序。 PC寄存器会指明异常发生的执行地址。

可以找到一个示例here,尽管在示例中使用printf 可能是不明智的;你想要一些直接写入 UART 的无缓冲的东西,我建议 - 系统已经坏了 - 获得诊断所需的代码越少越好。类似的解决方案here 只是将值复制到变量中,并要求您在调试器中设置断点来检查它们。

要查看报告的 PC 地址处的代码,请查阅编译器的映射和/或列出输出文件,或者将地址直接输入到调试器中的 PC 寄存器中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多