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.

[参考译文] RM57L843:RM57L843

Guru**** 2459550 points
Other Parts Discussed in Thread: RM57L843

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/649031/rm57l843-rm57l843

器件型号:RM57L843

1.当选择 RAM 组29和30 L2RAMW 时 、这是否意味着 PBIST 将测试寄存器组?

根据 RM57Lx 16_32 RISC 闪存微控制器技术参考手册和基于 ARMRegisteredCortexRegistered-R 内核的 RM57L843 HerculesTm微控制器(修订版 C), 只有一组从 0xFFFFFF900U 开始的 L2RAMW 寄存器,为什么 RAM 组  29和30都 是 L2RAMW,有何区别?

当选择 RAM 组 30时、在 PBIST 之后、发生数据中止、但是 PBIST 本身的结果是正确的。 为什么会发生这种情况? 如何处理?  

RGS 和 RDS 的用途是什么?

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

    用户好!

    [引用 user="user5090366"]

    1.当选择 RAM 组29和30 L2RAMW 时 、这是否意味着 PBIST 将测试寄存器组?

    根据 RM57Lx 16_32 RISC 闪存微控制器技术参考手册和 基于 ARMRegisteredCortexRegistered-R 内核的 RM57L843 HerculesTm微控制器(修订版 C), 只有一组从 0xFFFFFF900U 开始的 L2RAMW 寄存器,为什么 RAM 组  29和30都 是 L2RAMW,有何区别?

    [/报价]

    如数据表中所述、在整个器件中有多个 RAM。 主 RAM (SRAM)被分成2个"组"的存储器、每个组都有一半的可用 SRAM。 其中的每一个被识别为一个"RAM 组"、PBIST 可在这个组上执行其测试引擎。 可以同时选择这些选项、以便在一次 PBIST 运行期间一次性测试所有 SRAM、也可以单独测试、以便在任何给定时间测试一半 SRAM。 由于 PBIST 测试是一种破坏性测试、因此如果有数据需要保留、有时需要这样做。 请注意、这是实际存储器、而不是 RAM 包装程序本身的寄存器。

    [引用 USER="user5090366]3.当 选择 RAM 组 30时,在 PBIST 之后,会发生数据中止,但 PBIST 本身的结果是正确的。 为什么会发生这种情况? 如何处理?  [/报价]

    这很可能是 PBIST 算法破坏性导致堆栈损坏的结果。 也就是说、堆栈可能位于与 RAM 组30相同的存储器范围内、这会导致堆栈上存储的返回地址中出现一个不确定的值。 建议仅在引导时加载和运行 PBIST、因为这样可以减少维护堆栈和其他需要保留的 RAM 内容的复杂程度。 如果在应用期间需要运行 PBIST、则需要设计一个管理方案、在这个方案中、在测试前备份被测 RAM 组中的数据、然后在测试后恢复。

    [引用 user="user5090366"] 4. RGS 和 RDS 的用途是什么?

    这两篇文章在解释 RGS:RDS 方面做得相当好。

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

    根据 RM57Lx 16_32 RISC 闪存微控制器技术参考手册、  STC1_1_ROM_R5的 RAM 组号为 2、但 STC1_1_ROM_R5的 RGS 为14、它们为什么不同?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回答、它们非常有帮助。 数据中止的原因不是堆栈已损坏。 这是因为一些全局数据被分配在0x08020000至0x08080000之间的 RAM 中。 PBIST 之后全局数据被损坏。 我想把它们复位为0、我已经在0x08020000至0x08080000之间检查了 RAM、它们都是0、没有 PBIST。 问题是、即使在通过调用布尔 SL_SelfTest_PBIST_StopExec (void)禁用 PBIST 之后、我也无法更改该值。 为什么会发生这种情况? 如何处理?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    用户好!

    首先、我建议您在初始化全局数据之前运行 PBIST、这样它就不会成为被覆盖的问题。 如果需要像工业应用中常见的情况那样在很长一段时间内提供 RAM 完整性的保证、我建议认为 ECC 在初始引导时间 PBIST 检查之后的100%时间内保护安全目标。 另请注意、还有应该定期运行的 ECC 功能证明测试、并且 ECC 逻辑也包含在 CPU 锁步机制中、所以它也受到锁步 CPU 安全机制的保护。

    也就是说、您是否使用 SafeTI 诊断库来执行 PBIST 或您创建的某些其他代码。 您能否发布您的代码以便我查看它?

    另一个可能发挥作用的因素是使用高速缓存。 如果您正在修改这些内存位置、并且它们位于高速缓存中、则可能无法在实际 RAM 中看到更新。 可以肯定的是、您可以将这些存储器区域配置为写入、这样它们将立即更新。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    静态布尔 RamGroupTest (寄存器 uint64 ramGroup、寄存器 UINT32 algoInfo、sl_PBIST_FailInfo* param1)
    {
    布尔 RET = false;
    RET = sl_SelfTest_PBIST (PBIST_EXECUTE、RAMGroup、算法信息);
    if (RET = true){
    while (sl_systemREG1->MSTCGSTAT 和0x1u)= 0x0u);
    RET = sl_SelfTest_Status_PBIST (param1);
    }else
    
    
    
    
    
    {void return};
    布尔值(return)
    布尔 RET = true;
    RET = RamGroupTest (0x000000000000000f、0x00000001、&RamTestParam[0]);
    RET = RET && RamGroupTest (0x000000000000000f、0x00000002、&RamTestParam [1]);
    RET = 0x000000&& RamTestParam Test (0x000000000cffbff0、0x00000004、0x00000002、&RamGroupTestParam)
    
    
    
    
    ;RETA= 0x00000003、RAPRAM & RETURN = 0x00000008;RETURN = 0x0000000**(0x00000003 /
    #define STACK_BASE0x08000000
    #define STACK_SIZE(0x08003400 - 0x08000000)
    #define RAM_REGION0x08003400
    #define RAM_REGION RAM_SIZE(0x08080000 - 0x08003400)
    
    #if 1
    #define RAM_BACKUP_LENGTH(RAM_REGISE_SIZE >> 2)
    // PBIST_SIZE
    = 0x088032* RAM
    
    
    =
    
    0x8032* RAM INTE_INTEN = 0x8032* 0x8032* 0x8032*(0x8032*)#define RAM INTE_RAM INTE_RAM = 0x8032* RAM INTE_RAMFF_RATE_RATE_RATE_RATE_RATEN)
    while ((UINT32) i < 0x08080000){
    *i = 0;
    i++;
    }
    
    
    void StoreRam (void)
    {
    volatile UINT32* i =(UINT32*) 0x08020000;
    while (UINT32) i < 0x08080000){
    RamBackup[(UINT32) i = 0x0832*
    
    
    
    
    (UINT32)+);
    
    
    while UINT32+(UINT32+)+(UINT32+)+)+(UINT32+)+(UINT32+)+= 0x0832+)+(UINT32+)+(UINT32+)+(UINT32+)+(UINT32+)(UINT32+)+)+(UINT32+)+(UINT32+(UINT32+)+)+(UINT32+)+)+(
    
    
    
    } 

    缓存已禁用、直到 SAFERTOS 启动。