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.

[参考译文] TMS570LC4357-EP:VIM RAM 故障注入:ESM ISR 未被清除

Guru**** 2477075 points
Other Parts Discussed in Thread: HALCOGEN, TMS570LC4357

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/997469/tms570lc4357-ep-vim-ram-fault-injection-esm-isr-not-being-cleared

器件型号:TMS570LC4357-EP
主题中讨论的其他器件:HALCOGENTMS570LC4357

大家好、

首先、如果这最终出现在错误的论坛中、我们深表歉意。 我导航到 Hercules 论坛并尝试创建新主题、但使用我正在使用的实际器件型号时、我的帖子似乎 会分配 给"其他微控制器论坛"。

问题1:

在任何情况下、我都会遇到将可纠正(即单个位)错误注入 VIM RAM 地址空间内的某个字的故障注入的问题。 我在 Halcogen 中生成了一个项目、在这里我启用 ESM 组1第83行(正如我理解的那样、这是可纠正的 VIM RAM ECC 错误。) 我还验证了 VIM RAM ECC 在 VIM 配置下被启用。 我将 ESM 组1第83行错误设置为使一个 ESM 低级 IRQ (即非 FIQ)事件有效、然后在 hl_notification.c 中由 Halcogen 提供的 esmGroup1Notification 回调中输出一些调试信息

为了触发 ECC 错误、我遵循了 TMS570LC4357 TRM VIM 一章中规定的程序:

-我确保 ECCENA 被置位并且 VIM RAM 已经被初始化。 (这已经由我从 main()调用的 vimInit()处理)

-然后、我通过将 0x5 <<  8写入 ECCCTL 来启用 ECC 位映射(更具体地说、我将绝对掩码写入:0xA << 0 | 0x5 << 8 | 0xA << 16 | 0xA << 24写入 ECCCTL)

之后,我尝试读取 VIM ECC 地址空间内的一个字(我映射了一个包含 u32条目数组的易失性结构),翻转6个 LSB 中的一个,并将该字写回... 或-执行相同的操作、但要执行 VIM RAM 本身内的向量条目。

在上述两种情况下、我都获得了一个到 esmGroup1通知的 IRQ 和向量(来自 HL_ESM.c 内的 esmLowInterrupt)。 当我打印出通道参数时、我可以看到它是正确的(当我重新添加 ISR 关闭的偏移时、我看到它是 ESM 通道83的通知)。 但是、似乎 ISR 一直被反复调用、我无法从中断上下文中退出。 这是尽管查看了 TI 的 ISR 代码、但根据 TRM、ISR 通过向 SR4写入1<<19来清除错误标志是很明显的。

出于完整性考虑、我使用的是 Halcogen 04.07.01、主要针对 GCC 工具。 我使用的是基于标准上游交叉存根项目构建的 GCC 10.2、具有必要的大端字节序多库支持。

Halcogen 项目是以 TMS570LC43x 为目标的标准项目、启用 LIN1高电平、RTI 比较0和 ESM 低电平 IRQ。  

谢谢!

-AG

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

    您好!

     您能否在 ISR 早期而不是在 ISR 退出之前的末尾清除中断标志。 清除操作需要一些周期才能传播到状态寄存器。 有可能退出 ISR、但是清除操作没有到达寄存器。 在这种情况下、该标志仍处于挂起状态、它将再次触发中断。

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

    因此、从我可以看到、ISR 实际上已经以相当快的速度清除。 被矢量化的第一个函数是 esmLowInterrupt (这实际上是 ESM 低级通道在 VIM RAM 中注册的函数)。

    立即进入函数时、我看到 IOFFLR 寄存器被读取、该寄存器本身应根据 TRM 清除多个条件。 紧随其后、在检查从 IOFFLR 读取的值后、处理程序立即以正确的位偏移写入正确的 SRX 寄存器。 只有在所有这些之后,才调用 esmGroup1Notification 以运行用户代码。

    据我所知、这是正确写入的 IRQ 处理程序能够清除 ESM 错误状态标志的最快速度。 我是否错过了替代程序或一些勘误表?

    谢谢!

    -AG

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

    尊敬的 AG:

    我查看了 HALCoGen 生成的 ESM ISR、并注意到代码中存在错误。 下面突出显示的部分应为 VEC-128、而不是 VEC-64

    我稍后将提交错误通知单并在发行说明中添加错误变通办法。 谢谢 AG

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

    我认为我们的信息将跨越路径。 我昨天注意到了这一点、并根据有关 ESM 寄存器的 TRM 章节对其进行了修复。

    我还观察到、为了正确清除事件、我需要实际清除 VIM SBERR 标志并根据 SBERRADDR 对更正后的矢量执行回写操作。 现在、我能够可靠地将单位可恢复的错误注入 VIM RAM。

    我还有其他几个问题、但我不会占用这个主题、而是创建一个新主题。

    感谢您的帮助、我很高兴这也导致了一个错误被识别。