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:在注入内存错误时检查 ESM 标志

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1000065/rm48l952-checking-esm-flags-when-injecting-memory-errors

器件型号:RM48L952

您好!

我正在测试一些用于监视组1-3中 ESM 标志的代码。 我正在尝试注入故障、并看到相应的 ESM 错误已设置。

首先、我执行了一个测试来将错误注入到锁步比较中、我只是通过将0x9写入 KEYR 寄存器来实现。  
组2中的 ESM 错误位2按预期进行了相应设置、因此测试看起来正常。
 

然后、我尝试为 RAM ECC 实施错误注入。 我通过以下代码执行了此操作:

#define TCRAM_SYN_2BIT_DATA_ECC ((uint64_t)0x0303030303030303U) /* this corrupts the ecc with 2 bit error */
#define TCRAM_RAMCTRL_ECCWREN ((tU32)(1u << 8u))

/* 16 byte alignment is required to ensure that the starting address is always an even bank */
#pragma DATA_ALIGN(g_sramEccTest_arr, 16);
volatile uint64_t g_sramEccTest_arr[2] = {0u};

static void injectErrorRAMECC(const tB evenBank)
{
    volatile uint64_t ramread = 0U;
    volatile uint64_t* eccX;
    uint8_t testIdx = evenBank ? 0u:1u;

    /* Update ECC */
    g_sramEccTest_arr[testIdx] = 0u;

    eccX = &g_sramEccTest_arr[testIdx];
    eccX = eccX + (0x00400000u/sizeof(uint64)); // ECC is stored with an offset of 0x400000

    /* Enable writes to ECC RAM */
    tcram1REG->RAMCTRL |= TCRAM_RAMCTRL_ECCWREN;
    tcram2REG->RAMCTRL |= TCRAM_RAMCTRL_ECCWREN;

    /* Disable RAM ECC */
    _coreDisableRamEcc_();

    /* Force a double bit error */
    *eccX ^= TCRAM_SYN_2BIT_DATA_ECC;

    /* Enable RAM ECC */
    _coreEnableRamEcc_();

    /* Disable writes to ECC RAM */
    tcram1REG->RAMCTRL &= ~TCRAM_RAMCTRL_ECCWREN;
    tcram2REG->RAMCTRL &= ~TCRAM_RAMCTRL_ECCWREN;

    /* Read the corrupted data to generate error */
    ramread = g_sramEccTest_arr[testIdx];
}

当第38行(ramread = g_slamEccTest_arr[testIdx];)被执行时、MCU 似乎直接复位、因此我无法验证 ESM 寄存器中的相应位是否被置位。
我认为应该调用_dabort、然后它应该从下一条指令继续执行、但似乎直到复位后才执行_dabort。

是否有任何想法、问题可能出在哪?

我还想知道被视为 RAM 不可纠正错误和 RAM ECC 不可纠正错误之间的区别是什么? 我在 SafeTILib 中找不到任何方法注入除 RAM ECC 错误以外的其他错误。

此致

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

    您好!

    您的代码看起来正常。  读取 g_slamEccTest_arr[]应该会生成2位 ECC 错误和数据中止。

    请检查  RAMERRSTATUS 寄存器的 DERR 位是否被置位、ESM 组3的位7是否被置位。

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

    QJ Wang、您好、事实证明我在调试时具有过高的优化级别。 因此、我没有看到跳转至 dabort 处理程序、而是 MCU 被复位。 在没有优化的情况下、我可以看到代码通过 dabort 处理程序获取预期的路径、然后在启用 ECC 写入访问的情况下卡在无限循环中或分支到之后的指令。