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.

[参考译文] TMS320F2800157:RAM ECC 测试

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1360578/tms320f2800157-ram-ecc-test

器件型号:TMS320F2800157

你好  

我在 sdl_ex_ram_ecc_quitance_test.c 文件中有以下问题:

在 runCorrectableECCTest 和 runUncorrectableECCTest 中 、为什么要遵循该序列?

1.浏览 M0 RAM 位置、直到每个位都注入了一个单位错误。
2.遍历 M0 RAM 位置,直到低16位 (位6:0)的每个 ECC 位都有一个错误注入该位置。
3.遍历 M0 RAM 位置,直到高16位 (位14:8)的每个 ECC 位都有错误注入该位置。

为什么选择只测试 M0而不测试 M0和 M1? 我在我的项目中使用的是 M0和 M1、我应该为两者实施测试还是测试 M0是否足够?
3 -在我的项目中、我还使用 LS0和 LS1、我需要对它们运行 RAM ECC 测试?  

4-为什么选择在 LS1上运行奇偶校验,在 M0上运行 ECC 测试? 我的意思是没有涵盖在奇偶校验和 ECC 测试中记忆的所有内容?
5-为什么要在测试结束时每循环一次而不是每次将原始数据加载到 m0Data (Restore m0Data)中?

谢谢。  

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

    1.为执行 ECC 逻辑的全面测试,我们测试每一位数据和 ECC 中的错误检测。 这使测试具有更高的诊断覆盖率、然后只测试一两个位。

    2.我们刚刚演示了 M0作为示例,但是您应该对所使用的每个 RAM 模块重复测试,所以您应该测试 M1。

    3. LS0和 LS1没有 ECC。 它们只有奇偶校验、所以您应该测试奇偶校验逻辑。

    4.存储器有 ECC 保护或奇偶校验保护、但不能同时具有 ECC 保护和奇偶校验保护。 器件数据表中有一个表格、显示每个存储器具有哪种类型的保护。

    5.将原始值写回到存储器位置会在向不同位注入错误之前再次将 ECC 更新为正确值(即覆盖注入的错误)。 虽然我想你可能会认为 runCorrectableECCTest()函数中不需要这个函数,因为硬件已经纠正了错误。

    惠特尼

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

    感谢您的回答、  

    执行以下步骤:
    1.浏览 M0 RAM 位置、直到每个位都注入了一个单位错误。
    2.遍历 M0 RAM 位置,直到低16位 (位6:0)的每个 ECC 位都有一个错误注入该位置。
    3.遍历 M0 RAM 位置,直到高16位 (位14:8)的每个 ECC 位都有错误注入该位置。
    为什么您在单次触发中对数据进行测试、但在两个阶段中对 ECC 位进行测试、一个阶段从0:6位开始、另一个阶段从8:14位开始?  

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

    循环被分割只是因为低数据、高数据和地址的 ECC 位彼此不相邻——它们之间跳过了一个位。

    TRM 中有一个显示映射的表。

    惠特尼

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

    感谢您的回答、  

    在  runCorrectableECCTest 中、在检查 第三个循环中 errorAddr 的部分(从8:14开始的 ECC)。 为什么要将 1UL 添加到(uint32_t)&m0Data?

     if (errorAddr!=(((uint32_t)&m0Data)+ 1UL))

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

    在  m0Data = 0xAAAA5555U;中,我能知道您为什么选择这个地址吗?  
    如果我在 M1上进行测试、我可以使用什么地址范围来在 M1上执行相同的测试? 当我开发相同的测试但针对 M1时、您是否有我应该考虑的特定建议?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    、位于  runCorrectableECCTest 中、其中的部分检查了 第三个循环中的 errorAddr (从8:14开始 ECC)。 为什么要将 1UL 添加到(uint32_t)&m0Data?

    如 TRM 中所述、这些 ECC 位用于数据的高位字、因此我们专门添加1来寻址32位变量 m0Data 的高16位

    in  m0Data = 0xAA55U;,我能不能知道为什么选择这个地址?  [/报价]

    0xAA5555只是分配给存储器位置的随机值-您可以选择任何内容。 m0Data 的地址由链接器确定、但应用程序告诉它使用#pragma DATA_SECTION (m0Data、"ramm0")确保该值位于 M0中

    在 M1上执行相同测试时,可以使用什么地址范围? 当我开发相同的测试但用于 M1时,您是否有我应该考虑的特定建议?

    可以针对 M1执行类似的操作、其中在链接器命令文件中的 M1内定义一个段、然后使用#pragma DATA_SECTION 通知链接器将您的测试变量放置在该段中。 器件数据表将告诉您什么地址范围适用于 M1RAM。

    惠特尼

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

    我使用 M0的相同方法来测试 M1、相同的初始化步骤、创建了随机值、并使用与   示例类似的#pragma DATA_SECTION 将其分配给 RAMM1。

    该行为是、 在尝试注入单一位故障时、不触发可纠正的中断、甚至不设置 CURDERR 位。
    注意: CEINTFLAG 等于0
    我是否需要考虑与 M0不同的任何内容? 我是否需要启用 RAMM1的可校正错误中断?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我是否需要考虑与 M0不同的任何内容? 我是否需要启用 RAMM1的可纠正错误中断?

    除了错误注入位置的位置以及传递给错误注入函数的 MEMCFG_SECT_M1值之外、不应有任何其他变化。 但是、您需要注意的一点是堆栈的位置。 如果堆栈在 M1中、您可能会遇到代码无法正常运行的问题、因为堆栈存储器处于测试模式、因此行为不正常。 如果不调用 MemCfg_setTestMode ()函数将其重写为裸机寄存器写入以避免在启用测试模式时使用堆栈,则可能会有所帮助。

    在可纠正的错误函数中,您没有检查范围16:23

    该区域用于地址 ECC。 地址 ECC 错误始终是不可纠正的。

    惠特尼