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:在 SDL (SL_SelfTest_DMA) 中测试 DMA 时 ECC 地址错误

Guru**** 2555630 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1542736/tms570lc4357-wrong-ecc-address-when-testing-dma-in-sdl-sl_selftest_dma

器件型号:TMS570LC4357
主题中讨论的其他器件:HALCOGEN

工具/软件:

我尝试在 TMS570L4357 上使用 SafeTI 诊断库 (SDL)。 我使用的 SDL 版本是 2.4.0。 和 HALCoGen 4.7.1。
当我尝试使用 DMA_ECC_TEST_MODE_1BIT、DMA_ECC_TEST_MODE_2BIT、DMA_software_test 运行 DMA 自检 (SL_SelfTest_DMA) 时遇到了问题。 FAULT_INPLING 的两个测试成功完成。

下面是我用来测试的代码:

dmaRAMBASE_t *dmaRAM = (dmaRAMBASE_t *)0xfff80000u;
dmaDisableECC();
dmaDisable();
dmaEnable();
dmaEnableECC();

SL_Init_Memory(RAMTYPE_DMA_RAM);
execResult = SL_SelfTest_DMA(dmaTests[subIndex].testType);

深入 SL_SelfTest_DMA 函数后、我发现 DMAECCSBE 寄存器的值错误。

该函数将错误的值写入地址 0xFFF80010、但 DMAECSBE 设置为 0x00000018、而不是 0x00000010。 此外、当我通过向 SBERR 位写入 1 并从 DMAECCSBE 寄存器读取来清除错误信息时、它会复位为 0x00000008、而不是文档中所述的 0x00000000。

我遵循了此链接 (e2e.ti.com/.../tms570lc4357-dma-ecc-self-test-failing-randomly-due-to-incorrect-address-stored-in-dmaeccsbe) 中 关于在测试前重新设置 DMA RAM 的结论、但问题仍然存在。

我注意到以下几点:

1.不像在链接的帖子,我的测试结果是一致的,不是随机的。 有问题的地址始终为 0x00000018。

2.初始化 DMA RAM 后,我认为它会全部清除为 0。 但是、它在每个 0xn9 地址(0x09、0x19、0x29 等)都有一定的值。 以下是初始化后存储器的映像。


讽刺的是、当读取为 4 字节数据 (0x18) 时、它是有问题的地址的一部分。 当我在初始化后手动将这些存储器复位为 0 时、DMAECCSBE 寄存器被正确设置为 0x00000010、并且测试通过、如下代码所示:

dmaRAMBASE_t *dmaRAM = (dmaRAMBASE_t *)0xfff80000u;
dmaDisableECC();
dmaDisable();
dmaEnable();
dmaEnableECC();

SL_Init_Memory(RAMTYPE_DMA_RAM);

*(uint32_t *)0xfff80008 = 0;
*(uint32_t *)0xfff80018 = 0;

execResult = SL_SelfTest_DMA(dmaTests[subIndex].testType);

有人能帮我弄清楚发生了什么事吗?我该如何从根本上解决这个问题?

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

    尊敬的 Kim:

    延迟的道歉:

    了解问题和您的发现:

    1. DMAECCSBE 值:   DMAECCSBE (DMA ECC 一位错误地址)寄存器存储  发生一位 ECC 错误的字节地址。 如果显示 0x00000018、则表示在字节地址 0xFFF80018 (相对于 DMA RAM 基址)检测到 ECC 错误 0xFFF80000
    2. SL_Init_Memory 问题:   SL_Init_Memory(RAMTYPE_DMA_RAM)    0xn9 关键是您可以观察到未完全清除 DMA RAM、特别是保留值。
      • TMS570L4357 上的 DMA RAM 通常为 2KB、从 0xFFF80000  0xFFF807FF
      • 这种 0xn9 模式是可疑的。 当您读取 4 字节数据时、 0x18 可通过这些模式形成。 例如、如果 0xFFF80018  contains 0xXX000009 (其中是其他一些字节) XX 、并且 ECC 逻辑期望 0x00000000 有一个干净状态 0x09  0x19、则 0x29在启用 ECC 并访问存储器时、这个预先存在的(或,等)可能会被解释为一个 single-bit 错误。
    3. 手动清除修复:  当您手动设置 *(uint32_t *)0xfff80008 = 0;  *(uint32_t *)0xfff80018 = 0;时、您有效地清除了在这些特定位置导致 ECC 错误的存在问题的数据。 这确认  内存的内容(不一定是 SDL 的故障注入)是初始问题。
    4. DMA ECC 自检预期:  SDL 的 DMA ECC 自检(尤其是和) DMA_ECC_TEST_MODE_1BIT  DMA_ECC_TEST_MODE_2BIT依赖于 原始 内存状态。 它们注入特定的故障(1 位或 2 位)、然后验证是否  检测到注入的故障。 如果由于未初始化的存储器而预先存在 ECC 错误、则测试将因为检测到意外错误而失败。
    5. 0x00000008 残留:   0x00000008 清除 SBERR 位后的残留现象可能表明器件上 DMA ECC 寄存器存在另一个小问题或特定行为、但这是初始 0x18 错误这一主要问题的次要问题。 主要目标是使测试通过、这意味着防止初始 0x18 误差。

    根本原因:

    根本问题在于、 SL_Init_Memory(RAMTYPE_DMA_RAM) 在 TMS570L4357 的 SDL 版本 (2.4.0) 中是这样的  未完全或正确地将整个 DMA RAM 初始化为一个已知的 ECC 清除状态(例如全零) 。 这会留下在 DMA 控制器在启用 ECC 的情况下访问这些位置时触发 ECC 错误的残留数据、从而干扰自检。

    解决方案:

    最可靠、最基本的解决方案是 To  将整个 DMA RAM 显式清零  然后再运行 SDL DMA 自检。 这可确保  检测到干净的延迟、从而使 SDL 的故障注入成为测试期间唯一的 ECC 错误来源。

    --
    此致、
    Jagadish。

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

    还可以... 但是、 为什么 Init_Memory 无法完全初始化存储器呢? 它应该这样做。

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

    有人有想法吗?

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

    尊敬的 Kim:

    对延迟的回复表示歉意、我休息了几天、因此没有时间进一步解决此问题:

    虽然提供的技术文档不包含有关 SL_Init_Memory 功能的具体信息、但它们确实描述了 RAM 初始化的原理以及几种可能导致不完整初始化和后续 ECC 错误的潜在失效模式。

    根据相关文档、存储器初始化未完成的主要原因是对硬件初始化序列的处理不当、或部分存储器写入不会覆盖完整的 ECC 块。

    详细阐述

    提供的上下文重点介绍了有关存储器初始化和 ECC 错误预防的几个关键概念:

    1.基于硬件的 RAM 初始化

     TMS320F2837xS Real-Time Microcontrollers 手册介绍了 RAM 初始化的硬件特性。

    • 为了防止读取未初始化的 RAM 时出现 ECC 或奇偶校验错误、 RAM_INIT 每个存储器块都有一项可用功能。
    •  INIT 为特定的 RAM 块设置一个位即可启动此过程。 这将使用 0x0 数据初始化块、并计算相应的 ECC/奇偶校验位。
    • 成功的一个关键条件就是这样  在初始化过程中、任何主器件都无法访问存储器 。 软件必须轮询该 INITDONE 位以确认完成。 如果之前 INITDONE 设置内存访问、则文档会明确指出“内存读取/写入以及初始化不能正确进行。“

    2.未初始化的状态和 ECC

     DRA74x_75x and DRA72x Performance 文档说明了上电时的存储器状态以及软件干预的需求。

    • 器件首次上电时、ECC 奇偶校验位未初始化。
    • 对于软件来说、初始化将在 ECC 启用后读取的每个存储器块(例如,每 128 位)至关重要。 这可确保在进行任何访问之前正确设置奇偶校验位。

    3、部分内存写入

    同一文档警告不要仅初始化受 ECC 保护的存储器行的一部分。

    • 如果软件仅写入 ECC 存储块的一部分(例如,128 位行中一个 32 位字)、则 ECC 控制器执行读取 — 修改-写入操作。
    • 该操作从 ECC 存储器中读取现有数据和相关的未初始化(因此不正确)奇偶校验位。
    • 然后、控制器尝试使用此无效奇偶校验数据来检查是否存在错误、这可能会导致错误的 ECC 错误生成。 为避免这种情况、必须一次初始化整个存储器线、例如、使用 memset 与 ECC 块大小对齐的 CPU 或 EDMA 传输。

    --
    此致、
    Jagadish。

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

    手册和文档都不适用于我所使用的设备。 是否确定它们适用于我的 case?

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

    尊敬的 Kim:

    其中大多数也应该适用于此器件。 如果您发现任何不符之处、请告诉我、然后我将相应地进行进一步的研究。

    --
    此致、
    Jagadish。