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.

[参考译文] RM48L952:SafeTI:SRAM 测试 SRAM_PAR_ADDR_CTRL_self_test 在启用 FIQ 中断的情况下看起来会失败

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/597228/rm48l952-safeti-sram-test-sram_par_addr_ctrl_self_test-looks-to-fail-in-case-fiq-interrupts-are-enabled

器件型号:RM48L952
主题中讨论的其他器件:TMS570LS1224

我目前正在实施 SafeTI 的运行时检查(在启动过程中也会进行相同的测试)。

所有收费测试均正常(包括故障注入)、因此我转到 SRAM 测试并立即收到错误。  SRAM_PAR_ADDR_CTRL_self_test 测试导致问题。

SL_SelfTest_SRAM()在 SL_SelfTest_Resum结果* SRAM_stResult 中返回 ST_FAIL

失败的原因是此检查(RAM 写入部分)
           if (((TCRAM_RAMERRSTAT_WADDRPAR_FAIL =(uint32)(sl_tcram1REG->RAMERRSTATUS & TCRAM_RAMERRSTAT_WADDRPAR_FAIL)))&& // B1上的*写入奇偶校验错误
                   (TCRAM_RAMERRSTAT_WADDRPAR_FAIL =>(uint32)(sl_tcram2REG->RAMERRSTATUS & TCRAM_RAMERRSTAT_WADDRPAR_FAIL))&& // B2上的写入奇偶校验错误*/
                   (0!=(sl_esmREG->SSR2和((uint32) 1U <<ESM_G2ERR_B0TCM_ADPAR)))&&   /* B1奇偶校验错误*/
                   (0!=(sl_esmREG->SSR2和((uint32) 1U <<ESM_G2ERR_B1TCM_ADPAR)))){   /* B2奇偶校验错误*/
               * SRAM_stResult = ST_PASS;
           }否则{
               *SRAM_STResult = ST_FAIL;
           }

这里是 sl_tcram2REG 检查、我的状态值为0x100、预计值为0x200。

开始
sramEccTestBuff[0]= 0xAAAAAAAABBBBBBBBUL;//在 B1和 B2上生成写入奇偶校验错误*/

代码跳转至 ESM 中断处理程序(sl_ESM_HIGH_intr_handler ()))、当到达此行(CPU 寄存器压入堆栈(位于 RAM 中)时、0x100已处于 tcram2状态。
esmOffH =(uint8) sl_esmREG->IOFFHR;

因此、很可能在启用 FIQ 中断的情况下不会运行此测试、因此无法在软件运行时运行此测试。

我在检查寄存器内容之前插入了寄存器打印、对结果进行了双重测试(根据之前的行中的注释、在这里应该是安全的)
           /*恢复奇偶校验、以便我们可以使用堆栈*/
           /*SAFETYMCUSW 134 S MR:12.2 备注_5*/
           sl_tcram1REG->RAMCTRL =(sl_tcram1REG->RAMCTRL & 0xF0FFFFFFU);
           /*SAFETYMCUSW 134 S MR:12.2 备注_5*/
           sl_tcram2REG->RAMCTRL =(sl_tcram2REG->RAMCTRL & 0xF0FFFFFFU);
           DBG_PRINT ("TCRAM1_STAT:0x%x、TCRAM2_STAT:0x%x\r\n"、SL_tram1REG->RAMERRSTATUS、SL_tcram2REG->RAMERRSTATUS);
           if (((TCRAM_RAMERRSTAT_WADDRPAR_FAIL =(uint32)(sl_tcram1REG->RAMERRSTATUS & TCRAM_RAMERRSTAT_WADDRPAR_FAIL)))&& // B1上的*写入奇偶校验错误
                   (TCRAM_RAMERRSTAT_WADDRPAR_FAIL =>(uint32)(sl_tcram2REG->RAMERRSTATUS & TCRAM_RAMERRSTAT_WADDRPAR_FAIL))&& // B2上的写入奇偶校验错误*/
                   (0!=(sl_esmREG->SSR2和((uint32) 1U <<ESM_G2ERR_B0TCM_ADPAR)))&&   /* B1奇偶校验错误*/
                   (0!=(sl_esmREG->SSR2和((uint32) 1U <<ESM_G2ERR_B1TCM_ADPAR)))){   /* B2奇偶校验错误*/
               * SRAM_stResult = ST_PASS;
           }否则{
               *SRAM_STResult = ST_FAIL;
           }

结果与通过调试器检查相同...
TCRAM1_STAT:0x200、TCRAM2_STAT:0x100

已尝试在 if 语句后打印,结果相同...


在任何地方都没有提到启用 FIQ 中断时无法运行此测试(看不到启动阶段测试的任何其他有意义的区别、因为此测试会单独禁用中断、因此在执行测试时不应发生上下文切换)。

解释是否正确? 如果是、您能否列出运行时不应尝试运行的所有 SafeTI 测试、pbists 等都非常明显、但与此类测试不一样。

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

    我们已收到您的问题、我们将对其进行审核并尽快向您提供反馈。

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

    只是注意到了什么

    在测试读数后、有代码注释表明没有 RAM 访问
           if (ST_PASS =* SRAM_STResult){
               /*覆盖奇偶校验(实际上是翻转).. 此时不能访问 RAM (有意错误除外)*/
               /*SAFETYMCUSW 134 S MR:12.2 备注_5*/
               sl_tcram1REG->RAMCTRL =(sl_tcram1REG->RAMCTRL 和0xF0FFFFFFU)| TCRAM_RAMCTRL_ADDR_parity;
               /*SAFETYMCUSW 134 S MR:12.2 备注_5*/
               sl_tcram2REG->RAMCTRL =(sl_tcram2REG->RAMCTRL 和0xF0FFFFFFU)| TCRAM_RAMCTRL_ADDR_parity;
               sramEccTestBuff[0]= 0xAAAAAAAABBBBBBBBUL;//在 B1和 B2上生成写入奇偶校验错误*/
               sramEccTestBuff[1]= 0xBBBBBBBBBBAAAAAAAAUL;

    ESM 处理程序通过读取 RAM 中的测试活动标志以及增加和标记变量来使用 RAM 进行此测试

           案例 ESM_G2ERR_B0TCM_ADPAR:
              if (true = sl_FLAG_Get (SRAM_PAR_ADDR_CTRL_self_test)){
                  callbackCancelCount++;
                  CancelCallback = true;
               }

           案例 ESM_G2ERR_B1TCM_ADPAR:
              if (true = sl_FLAG_Get (SRAM_PAR_ADDR_CTRL_self_test)){
                  callbackCancelCount++;
                  CancelCallback = true;
               }
              callbkParam1 = sl_tcram2REG->RAMPERADDR;
               /*此处没有要清除的状态*/
               中断;

    此外、mGroup2Handler 在堆叠寄存器时使用 RAM
    静态空 esmGroup2Handler (uint8 esmChannel)

    esmGroup2Handler:
          0xb878:0xe92d 0x41f0 push.W   {R4-R8、LR}
          0x0004        MOV     R4、R0
       布尔 CancelCallback = false;

    因此、基于此、我做了一个成功的小实验(如果您调用 esmGroup2Handler 并在这些情况发生后立即使用 RETURN、因为变量在使用 RAM 的函数调用中堆栈)
           否则、如果(esmOffH >= 32U){
               /*组2通道0至31 */
               esmChannel = esmOffH - 32U;
               if (esmChannel =ESM_G2ERR_B0TCM_ADPAR || esmChannel == ESM_G2ERR_B1TCM_ADPAR)
               {
                   返回;//无 RAM 访问
               }
               其他
               {
                   esmGroup2Handler (esmChannel);
               }
           }

    通过此修改后、测试结果通过、当然不能使用此修改、因为现在它还屏蔽了实际错误、或者说不通知应用是正确的方式、 基本上、测试活动信息应该被隐藏在某些 CPU 寄存器、外设 RAM 或者其它一些东西中、否则、运行这个测试应该需要...

    SafeTI 的目的是让集成商作为 TI 的调试器工作吗? 我们真的不能等待几天来获得反馈、例如专家应该在几分钟/小时内发现这种行为的原因、并且问题已经开放了几天、 上次需要2周时间才能确认 DMA 测试中的真正简单错误...

    我们迫切需要获得正确的用户手册、其中说明了所有错误、并描述了应如何使用每个函数以及何时和何时不使用这些错误。 显然、例如、如果启用了 FIQ、则无法运行此测试、因为它使用 RAM…… 你们真的测试了代码吗? 如果是、那么为什么手册中没有说明这些约束条件、例如、如果启用 FIQ、则不运行此测试、这意味着该测试无法在运行期间运行?

    仅在启动时运行此测试是否足够? 由于我们无法可靠地将唯一标识符映射到 SafeTI 测试、因此我们制定了一项策略、即运行中的每个测试(例如在 SRAM 中)、以便能够声明所有唯一标识符都已完成、这意味着这些标识符是通过运行_SRAM-Function 生成的、 这也是手册中的一个真正重要的"错误"、即它仅声明函数而不是参数。

    -这个测试是 RAM13吗?

    至少在一定时间内必须运行一些测试(诊断诊断) 看起来此 ESM 通道仅通过此测试进行测试、因此我们现在是否需要从 FMEDA Excel 串行 SRAM 中删除一些唯一的标识符、因为此测试仅在启动时执行、请勿回答"这取决于您的应用"??

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

    看起来"测试修复"不起作用、即使它看起来是在第一眼就能工作的、因为 sl_ESM_HIGH_intr 处理程序()也在入口中使用堆栈... 还想知道为什么这看起来运行方式稍有不同、具体取决于您单步执行调试器还是仅运行调试器代码、基本上测试总是失败、但在代码的不同部分...

    也许应该执行 ASM 处理程序、并且应该临时切换到 SL_ESM_HIGH_intR_handler 的位置以防止堆栈使用。 在 ASM 处理程序恢复奇偶校验、然后检查测试标志是否处于活动状态、如果是从 FIQ 返回、则调用 sl_ESM_HIGH_intr 处理程序()、因为这是一个真正的错误? 或者类似的东西、这应该模仿启动阶段的行为、其中 FIQ 根本没有启用...

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

    即使我在 TMS570ls1224上遇到了以下自检 API 的相同问题。
    RetVal = sl_SelfTest_SRAM (SRAM_PAR_ADDR_CTRL_self_test、true、&failInfoTCMRAM);

    我在 B2上设置读取奇偶校验错误,而不是在 B2上设置写入奇偶校验错误。

    当我交换了 sl_SelfTest_SRAM()函数中的以下两个缓冲区时,自检 API 通过。
    sramEccTestBuff[1]= 0xBBBBBBBBBBAAAAAAAAUL;
    sramEccTestBuff[0]= 0xAAAAAAAAAABBBBBBBBUL;

    这是一种非常奇怪的行为、我不明白它是如何通过的。
    您能否提供以下自检 API 的更多信息和用法
    SL_SelfTest_SRAM (SRAM_PAR_ADDR_CTRL_self_test、true、&failInfoTCMRAM);

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

    我目前正在调查、以尝试了解此更改为什么会导致测试案例通过。 当我有答案时、我会回来的。