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.

[参考译文] TMS320F28388D:CM 中存在 NMI 故障。不可纠正的闪存错误、但 UNC_ERR_ADDR_HIGH 指向 RAM/Stack。

Guru**** 2481465 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1451499/tms320f28388d-nmi-fault-in-cm-uncorrectable-flash-error-but-unc_err_addr_high-points-to-ram-stack

器件型号:TMS320F28388D

工具与软件:

我遇到了与下面两个其他帖子完全相同的问题。 Re 支持此问题以提高 TI 和社区的知名度。  

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1243797/tms320f28388d-nmi-by-uncorrectable-error-in-cm/4708197?tisearch=e2e-sitesearch&keymatch=fluncerr#4708197

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1079766/tms320f28388s-fluncerr-error-causing-the-cm-to-reset-but-unc_err_addr_high-points-to-stack?tisearch=e2e-sitesearch&keymatch=fluncerr#

短版本:

F28388D。 在 CM 中、在经过各种运行时时间(几分钟到几小时)后、CM 将遇到 NMI 异常。 在检查 FlashECC 时、我看到了与其他两个柱相同的情况。 也就是说、不可纠正的闪存错误、其锁存错误地址指向 C1RAM 中的堆栈。 违规地址始终相同。  

其他信息:

*代码在定制设计上运行(即非 TI 评估板)。  

*闪存等待状态= 2.

*应用程序代码 仅在操作期间读取闪存。 (在代码执行期间不会进行闪存擦除或写入)。  

* CM 时钟125 MHz

*可在3个不同的板上重复。 在发生异常之前、所有异常都需要大约10-150分钟或运行时间。  

*在我的 git 提交历史记录中,我可以回滚一个提交,该版本运行9天以上没有问题。  

*只有 no-problem-commit 和 problem-commit 之间的区别:

我尝试过的:

*将堆栈从512字节增加到2048字节。 仍然出现问题。  

*将闪存等待状态从2更改为4。 这是成功的人在其他一个职位。 这对我来说并没有解决问题。  

*查看2024年3月勘误表。 无相关条目。  

为消除此问题、我采取了哪些措施:

将5个浮点值从堆栈中移出并置于普通变量存储器中。 提醒一下、没有证据表明这是堆栈溢出。 如上所述、将堆栈从512字节增加到2048字节并没有解决该问题。  

总结:

我做了什么"修复"的问题似乎非常类似于其他两个帖子的"修复":一人从 C1RAM 移动堆栈到 C0RAM,一人插入了一个 NOP。 在我看来、所有这些修正都是"工作"、其时间不一而足、不足以解决地雷问题。 我不相信任何这些解决办法真正解决根本原因-这似乎是未知的。 正如您可以想象的那样、我们对此次修复并不是很满意、因为将来的代码更改似乎很可能会导致问题再次出现。  

对于代码更改导致此问题的原因、我无法得出任何理论。  

对 TI 来说:这里有一个真正的问题和模式。 请提供帮助。  

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

    Kevin

    对不起延误,我们很多人已经 OOO 和刚刚回来。  

    我曾向一些有过以前的帖子历史的人介绍过、尽管他们在办公室里呆了一天左右、但我想继续、让您知道这是一个被关注的问题。

    我提出了一些澄清问题:

    q1)上述代码从哪个闪存地址范围执行?

    Q2)发生此错误时、堆栈的地址是什么

    q3)当您使变量传递(将其从堆栈中移出)时、变量的地址是什么

    q4)您是否尝试过从不可纠正的错误处理程序返回、以查看导致问题的代码行(返回地址之前有一行代码、但这会缩小范围)?  从你的图像,我们知道,移出堆栈这些变量是有帮助的,但我也感兴趣的是,如果我们能够确定哪个指令产生错误的内存错误。  每次运行失败时是否是相同的指令?

    Q5)假设它位于您复制的代码区域内、是否可以获取该代码(带地址)的解汇编视图、以便我们可以直观地了解指令的执行情况?  您只需在代码位于 CCS 中之后查看->反汇编、并且可以截取屏幕截图。

    为了找到根本原因、我们需要能够重现此问题、所以我会尝试看看我们能否将此问题理解为我们可以类似地放置以引发故障的少量代码。

    此致、

    Matthew

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

    您好、Matthew:

    下面是我对您的问题的解答:

    q1)上述代码从哪个闪存地址范围执行?

    违规代码包含在名为"UpdatePowerRegisters"的函数中。 根据映射文件、该函数位于0x2079B0。

    Q2)发生此错误时、堆栈的地址是什么

    堆栈放置在 C1RAM 中、大小为512字节。

    当我进入 nmiISR 时、堆栈指针为0x1FFFC178、该地址与 FlashECC 记录的不可纠正的闪存错误的地址相同。 根据我可以确定的内容、"故障"地址每次都是相同的、位于堆栈中的0x1FFFC178。

    Q3)当您使变量传递(将其从栈中移出)时、变量的地址是什么。

    当我将变量从堆栈中移出时、闪存故障不再发生、变量现在驻留在 BSS 中。

    q4)您是否尝试过从不可纠正的错误处理程序返回、以查看导致问题的代码行(返回地址之前有一行代码、但这会缩小范围)?  从你的图像,我们知道,移出堆栈这些变量是有帮助的,但我也感兴趣的是,如果我们能够确定哪个指令产生错误的内存错误。  每次运行失败时是否是相同的指令?

    Q5)假设它位于您复制的代码区域内、是否可以获取该代码(带地址)的解汇编视图、以便我们可以直观地了解指令的执行情况?  您只需在代码位于 CCS 中之后查看->反汇编、并且可以截取屏幕截图。

    清除 nmiISR 中的 FAULT 位并返回后、I 在此处着陆(如下所示)。 这是一个闪存 ECC 故障发生的示例。 您可以在堆栈上看到5个浮点变量。  

    在您浏览此信息的同时、我将尝试创建一个仍显示此问题的代码/项目的超精简版本、并将其发送给您。  

    谢谢你。  

    Kevin

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

    一些更新:

    (1)在上周、我花了大量精力来创建一个 TI 可运行的代码版本来重现问题。 但我没有成功。 从我的经验以及遇到此问题的其他两个人的经验中、我们都知道、故障发生和不存在之间即使是最细微的代码更改也可能不同。 因此、目前在这方面没有任何进展。  

    (2)我使用的是 F28388D。 在应用程序中、我们将在 CM 和两个 DSP 内核中运行代码、并在 CM 中观察到故障。使用调试器运行测试时、我加载了(1) CM 应用程序并以全速/正常速率运行、加载了(2) CPU2但在 main ()内的第一条指令停止、加载了(3) CPU1、运行 CM 初始化代码、然后停止。 66小时后、未观察到任何故障。 (在此提醒、在我的案例中、如果发生故障、始终会在1-2小时内看到、因此66小时肯定不会发生)。 请参阅下面的屏幕截图。  

    (3)然后、在同一个调试会话中(经过上述66小时后、没有闪存故障)、我点击了 CPU1上的"全速运行"。 在7分钟内、发生了故障。  

    因此、这里的主要发现是、该无法解释的闪存不可纠正的故障 必须在 CM 和 CPU1上运行代码才能发生。 仅运行 CM 不会引发故障。  

    在我看来、这就是芯片中某种内部总线/资源仲裁干扰。 要激活故障、您需要正确组合 CM 和 DSP、将活动/请求放置在其中一个内部总线上。 鉴于所有三个人的全部证据都遇到了这个问题、它看起来不像是代码/编译器问题。  

    仍然希望 TI 能够重现问题并找到根本原因。