您好!
我正在测试一些用于监视组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 错误以外的其他错误。
此致