This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] F29H850TU:如何分析触发 NMI 中断的 ESM 错误的具体原因和类型

Guru**** 2512985 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1547752/f29h850tu-how-to-analyze-the-specific-cause-and-type-of-esm-error-triggering-nmi-interrupt

器件型号:F29H850TU


工具/软件:

如图所示、触发 NMI 中断后、使用 IDE 的脚本->错误处理->ESM_Sys ->ESM_Sys_check_stus。
由此可以推断、进入 NMI 的电流源信号是错误 Aggregator_CPU1_HPERR、
但寄存器中 CPU1 的错误类型都是 0。 我是否可以询问如何继续调查以确定进入 NMI 的具体原因。 便于我以后维修。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    对于 CPU1_HPERR、源可以是 CPU1 PR、DW、DR1 或 DR2。

    默认 NMI ISR 会清除错误聚合器类型信息并将其存储在结构中以供以后调试。

    根据您查看寄存器的位置、类型寄存器可能会在 NMI ISR 中被清除、请检查监视窗口中的 nmiStatus、并查看此处是否存储了错误类型。

    知道错误类型后、我建议您查看反汇编视图、将 PC 地址从错误聚合器 PC 寄存器中放置 、并在反汇编视图中放置一个断点、当它到达那里时、可以看到与该错误对应的代码并从那里找到错误源。

    错误地址寄存器值也有助于查找错误源、即由于 CPU 接口而发生错误的存储器/外设地址。

    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的答复。 我读取了 NmiStatus 的值、发现错误类型为 0x20(访问 ACK 错误)。
    根据 pcAddr 的相应操作、为 LD.32 D0、*(ADDR1)(A5+A0)。
    但我的错误并没有发生在固定的时间,它可能是几分钟,甚至几十分钟。 与当前错误相对应的函数是一个 5m_dask 周期调用、因此并非每个调用都有问题。
    我是否可以询问访问 ACK 错误是由软件错误还是硬件错误引起的、是否有任何建议的调查方向?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    是的、请在反汇编中的 PC (0x10054d12) 处通过点击地址后的左侧放置一个断点、例如、您将看到菱形红色、如下图所示。

    软件正在尝试读取位置 0x1A000000、这个位置似乎是错误/保留地址、我需要检查、您能确认为什么会出现这种情况。

    下面的 TRM 系统控制一章详细说明了访问确认、 请查看。

    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    抱歉、我不知道为什么地址为 0x1A000000。
    正如我之前提到的、这是一个周期性任务、因此它可以稳定运行、直到当前问题发生。
    我检查了 ISR 和任务的堆栈、没有溢出。
    经过几天的测试后、每次出现错误时、都会是 PC (0x10054d12)、始终为 0x1A000000。
    我目前没有好主意、因此我想请您提供帮助。

    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是否有随时间变化的变量、它似乎是 addr、它读取更改了、有时最终结果是 0x1A000000 

    您能在 PC 前后围绕两个三行代码共享该 PC 的代码吗? 错误源可能是 PC 指向的代码行之前或之后的一个或两个代码。

    您还可以将变量周围的 IF 条件置于、以检查其是否由于某种原因无效以执行 Estop 进行调试或切换 GPIO、如果变量无效、则在该变量之后保留 while 循环。

    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、我将以这种方式进行测试、以找到 1A 的源。 非常感谢。