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:如果 RAM 的 MPU 区域未按严格顺序配置、则不会产生 L2RAMW "总线错误&quot

Guru**** 2463330 points
Other Parts Discussed in Thread: TMS570LC4357

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/659076/tms570lc4357-l2ramw-bus-error-is-not-raised-if-mpu-region-for-ram-is-not-configured-in-strongly-ordered

器件型号:TMS570LC4357

您好!

我目前正在检查 RAM 中 SEU 和 MEU 错误的各种情况下的 CPU 行为。

1) 1)首先、我想提及另一个帖子、我认为其中有一个错误: https://e2e.ti.com/support/microcontrollers/hercules/f/312/t/630389

对于这个帖子最初问题的第三点、答案是在将 RAMCTRL 寄存器的 ECC 检测 EN 字段设置为0x5时、不会禁用 ECC 生成。

在最近执行的测试中、我会说这是错误的。 测试步骤如下:

  • 将 ECC_DETK_EN 设置为0xA (启用 ECC)
  • 自动初始化内部 RAM 至0 (ECC 代码被更新)
  • 在地址0x0800_0000处写入32位值0x4
  • 在地址0x0840_0000处读取相应的8位 ECC 值:值为0xEA
  • 将 ECC_DETK_EN 设置为0x5 (禁用 ECC)
  • 在地址0x0800_0000处写入32位值0x5
  • 在地址0x0840_0000处读取相应的8位 ECC 值:值为0xEA

>> ECC 内存读数相同

在 RAM 中启用 ECC 的测试相同:

  • 将 ECC_DETK_EN 设置为0xA (启用 ECC)
  • 自动初始化内部 RAM 至0 (ECC 代码被更新)
  • 在地址0x0800_0000处写入32位值0x4
  • 在地址0x0840_0000处读取相应的8位 ECC 值:值为0xEA
  • 在地址0x0800_0000处写入32位值0x5
  • 在地址0x0840_0000处读取相应的8位 ECC 值:值为0x03

>> ECC 内存读取因 ECC 启用和写入的值不同而有所不同

为避免混淆、我建议将这一点添加到原始帖子中、或使给出的答案无效。

2) 2)根据 TMS570LC4357 TRM 的表8-1、当 cortex-r5f 在低于64位的写入过程中检测到双位读-修改-写(RMW)错误时、L2RAMW 应生成总线错误。

由于第1)点被澄清、我能够在 RAM 中注入双位故障并从内核执行一个16位写入来检查这个行为、并且我注意到以下情况:

  • 如果内核 MPU 被禁用(使用 Cortex-R5 TRM 表7-1中记录的默认存储器映射)>>则不会生成异常中断
  • 如果内核 MPU 被配置为器件或正常存储器的 RAM 的一个区域启用>>则不会生成异常中断
  • 如果内核 MPU 被配置为严格顺序存储器的 RAM 的一个区域启用>>则会产生数据中止并将数据故障记录在 Cortex-R5 DFSR 寄存器中。
  • 独立于 MPU 配置、ESM 组3通道3按预期触发。

据我了解、TMS570LC4357 TRM 中记录的"总线错误"与"8.3.1故障>外部故障"一章中记录的 Cortex-R5 TRM "外部故障"相关。 我对这一点是否正确?

在下面的句子"非专用存储到正常类型或器件类型存储器生成异步中止"中、我知道当 MPU 配置为 RAM 区域的正常存储器或器件存储器时、在执行非专用存储时应生成异步中止、 但是、即使在执行16位写入 RAM 后使用 while 循环、也不会生成数据中止。

此行为与文档不一致。 您能否澄清正常和预期行为?

如果这是错误行为、它是否与芯片 B 勘误文档中记录的勘误表"DEVICE #40"相关?

此致、

盖尔

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

    您好、Gael、

    首先、为方便您提出问题、我不认为这与已知问题器件40有关、因为所述问题涉及到对这些外设帧内未实现地址/存储器位置的访问。

    对于您的其余评论和问题、我需要咨询我们以前的设计主管之一和有关该器件的器件专家。 我很快会再给您提供更多的意见、可能还有一些后续问题。

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

    您好!   

     在你第一个关于 Chuck 在另一个帖子中提供的答案的问题上、我想他是指 CPU 上的 ECC 检查不能被禁用。 您可以在 RAM 包装程序级别禁用 ECC 代码生成、如您所示。

    [引用用户="Gael Le Moing"]

    • f 内核 MPU 被禁用(使用 Cortex-R5 TRM 表7-1中记录的默认存储器映射)>>不会生成异常中断
    • 如果内核 MPU 被配置为器件或正常存储器的 RAM 的一个区域启用>>则不会生成异常中断
    • 如果内核 MPU 被配置为严格顺序存储器的 RAM 的一个区域启用>>则会产生数据中止并将数据故障记录在 Cortex-R5 DFSR 寄存器中。
    • 独立于 MPU 配置、ESM 组3通道3按预期触发

    [/报价]

     您的观察结果正确。 当 RAM 包装程序在读取-修改-写入操作期间未能通过 ECC 检查时、它会生成返回 CPU 的总线错误信号。 请注意、此错误与您执行的子字写入操作相关。 当您处于正常或器件中时、您是如何写入 RAM 的。 请注意、Cortex-R5F 可以执行写合并。 它可能已经将多个子字写入合并为一个64位写入、在这种情况下、整个64位连同8位 ECC 将被写入 RAM、从而覆盖之前在 RAM 中的内容。 完整的64位写操作不会创建读-修改-写操作。  

    [引用用户="Gael Le Moing"]

    据我了解 、TMS570LC4357 TRM 中记录的"总线错误"与"8.3.1故障>外部故障"一章中记录的 Cortex-R5 TRM "外部故障"相关。 我对这一点是否正确?

    [/报价]

    您的理解是正确的。

    [引用 USER="Gael LE Moing]在下面的句子"非独占存储到正常类型或器件类型存储器生成异步中止"中、我知道当 MPU 配置为 RAM 区域的正常存储器或器件存储器时、在执行非独占存储时应生成异步中止、 但是、即使在执行16位对 RAM 的写入后使用 while 循环、也不会生成数据中止。

    请参阅我的上述评论。 尝试执行一个16位写入、而不是创建写入合并的多个写入。  

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

    您好、Charles、

    第一点还可以

    第二点:

    [引用用户="Charles Tsaa"]

    Gael Le Moing
    • f 内核 MPU 被禁用(使用 Cortex-R5 TRM 表7-1中记录的默认存储器映射)>>不会生成异常中断
    • 如果内核 MPU 被配置为器件或正常存储器的 RAM 的一个区域启用>>则不会生成异常中断
    • 如果内核 MPU 被配置为严格顺序存储器的 RAM 的一个区域启用>>则会产生数据中止并将数据故障记录在 Cortex-R5 DFSR 寄存器中。
    • 独立于 MPU 配置、ESM 组3通道3按预期触发

     您的观察结果正确。 当 RAM 包装程序在读取-修改-写入操作期间未能通过 ECC 检查时、它会生成返回 CPU 的总线错误信号。 请注意、此错误与您执行的子字写入操作相关。 当您处于正常或器件中时、您是如何写入 RAM 的。 请注意、Cortex-R5F 可以执行写合并。 它可能已经将多个子字写入合并为一个64位写入、在这种情况下、整个64位连同8位 ECC 将被写入 RAM、从而覆盖之前在 RAM 中的内容。 完整的64位写操作不会创建读-修改-写操作。  

    [/报价]

    我只对 MEU 受影响的存储器执行一次16位写操作:"*(unsigned int *) 0x080000)= 3;"。 因此没有从 Cortex 进行合并。 此外、在组3通道3的 ESM 中标记了错误。

    您能否解释一下当 MPU 在正常存储器或器件存储器中配置为 RAM 区域时、为什么不会生成总线错误(数据中止)?

    第三点:

    [引用用户="Charles Tsaa"]

    Gael Le Moing
    在下面的句子"非专用存储到正常类型或器件类型存储器生成异步中止"中、我知道当 MPU 配置为 RAM 区域的正常存储器或器件存储器时、在执行非专用存储时应生成异步中止、 但是、即使在执行16位写入 RAM 后使用 while 循环、也不会生成数据中止。

    请参阅我的上述评论。 尝试执行一个16位写入、而不是创建写入合并的多个写入。  

    [/报价]

    我执行的是单个16位写入、后跟一个无限循环、并且异步中止永远不会发生(尽管 ESM 中提出了组3通道3错误)。 您如何解释未生成此中止?

    谢谢、

    盖尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否启用了高速缓存? 您如何配置高速缓存方案、直写式或回写式? 您是否可能有回写高速缓存、因此16位只写高速缓存而不是 L2RAM。 尝试禁用高速缓存或更改为直写高速缓存方案、并查看这是否会产生影响。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    缓存被禁用:Cortex-R5的 SCTLR 的 I 和 C 位被设置为0。
    MPU 可通过配置为外部和内部非高速缓冲非共享正常存储器的 RAM 区域启用(请参阅 Cortex-R5 TRM 的表4-36)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否检查 CPSR 中的 A 位。 如果您将其清除、它会起作用吗?

    不精确的中止屏蔽
    不精确中止的性质意味着它们可能在处理器处于运行状态时发生
    处理不同的中止。 如果一个不精确的中止在这样的中生成一个新的异常
    情况下、会覆盖 r14_abt 和 SPSR_abt 值。 如果这发生在之前
    数据被压入存储器中的堆栈、有关第一个中止的状态信息将丢失。
    为了防止这种情况发生、CPSR 包含一个用于指示的屏蔽位
    不能接受模糊中止、即 A 位。 当 A 位被置位时、任何不精确的
    发生的中止在 A 位清零前、处理器将挂起
    实际发生异常。 当中止、IRQ 或 FIQ 时、A 位自动置位
    在复位时发生异常。 只能清除异常中断处理程序中的 A 位
    在状态信息已堆叠到存储器或不再需要之后。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    查尔斯

    关于第一点,我将要求澄清文件。 实际上、RAMCTRL[ECC Detect EN]具有误导性名称、其描述仅表明 ECC 检测将被禁用。 此外、整个 L2RAMW 模块章节中没有说明如何禁用 ECC 生成的文本。 在位描述中添加此信息似乎是必要的。

    谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、
    这是一个成功:当在执行16位写入之前清除 A 位时、异步中止在几个周期后执行(我没有测量它、但很快就会测量它)。
    当在16位写入之后的 while 循环(几秒钟后)期间清除 A 位时、也会执行相同的操作(文档说明中止处于挂起状态、直到清除 A 位)。

    因此没关系、感谢您的帮助。
    此致、
    盖尔