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.
大家好,
在我们的项目中,启用了 ECC 以检测 SRAM 双位错误。 我们正在寻找一种模拟双位奇偶校验错误并查看其影响的方法。
但是,阅读完 TCRAM 模块的 SPNU499c 第6.6段仿真/调试模式行为后,调试器似乎无法在调试模式下强制执行此错误。
在检测到错误时,确保正确启用 SRAM ECC 并确认其影响的技术(如断言 nError pin)必须与 SECDEC 闪存错误检测和校正控制寄存器1的情况相同, 通过读取位于 OTP 的预定义地址?
非常感谢!
大家好,我们的专家已经不在办公室了。 请期待收到延迟的回复。
你好,查克,
您可以注入 SRAM ECC 错误。 请参阅 sys_selftest.c 中的函数 checkB0RAMEC():
检查 B0RAMECC 无效(无效)
{
挥发性 uint64 ramread = 0U;
易失性 UINT32正读数=0U;
UINT32加扰1勘误表,加扰2勘误表=0U;
UINT64加扰 A1_bk =加扰 A1bit;
UINT64加扰 A2_Bk =加扰 A2bit;
挥发性 UINT32 I;
/*用户码开始(36)*/
/*用户代码结束*/
/*启用写入 ECC RAM,启用 ECC 错误响应*/
加扰1REG->RAMCTRL = 0x0005010AU;
加扰2REG->RAMCTRL = 0x0005010AU;
/*第一个1位错误将导致错误响应*/
tced1REG->RAMTHRESHOLD = 0x1U;
加线2REG->RAMTHRESHOLD = 0x1U;
/*允许将 SERR 报告给 ESM */
加扰1REG->RAMINTCTRL = 0x1U;
加线2REG->RAMINTCTRL = 0x1U;
/*导致1位 ECC 错误*/
_coreDisableRamEcc_();
加扰1位错误^= 0x1U;
_coreEnableRamEcc_();
/*禁用写入 ECC RAM */
加扰1REG->RAMCTRL = 0x0005000AU;
加扰2REG->RAMCTRL = 0x0005000AU;
/*从具有1位 ECC 错误的位置读取*/
ramread = tcampa1位;
/*检查错误状态*/
加扰1勘误表=加扰1 REG->RAMERRSTATUS & 0x1U;
加扰2勘误表=加扰2 REG->RAMERRSTATUS & 0x1U;
/*SAFETYMCUSW 139 S MR:13.7 <批准>“LDRA Tool Issue”*/
/*SAFETYMCUSW 139 S MR:13.7 <批准>“LDRA Tool Issue”*/
IF ((加扰1勘误=0U)和&(加扰2勘误=0U))
{
/* TCRAM 模块未反映 CPU */报告的1位错误
自测故障通知(CHECKB0RAMECC_FIL1);
}
否则
{
/*清除 SERR 标志*/
tced1REG->RAMERRSTATUS = 0x1U;
加线2REG->RAMERRSTATUS = 0x1U;
/*清除 ESM 组1通道26和28的状态标志*/
esmREG->SR1[0U]= 0x14000000U;
}
/*启用写入 ECC RAM,启用 ECC 错误响应*/
加扰1REG->RAMCTRL = 0x0005010AU;
加扰2REG->RAMCTRL = 0x0005010AU;
/*导致2位 ECC 错误*/
_coreDisableRamEcc_();
加扰 A2bitError ^= 0x3U;
_coreEnableRamEcc_();
/*从具有2位 ECC 错误的位置读取数据,这将导致生成数据中止*/
ramread =加扰 A2bit;
/*恢复柱塞值前的延迟*/
/*SAFETYMCUSW 134 S MR:12.2 <批准>“等待几个时钟周期(未使用的值)”*/
/*SAFETYMCUSW 134 S MR:12.2 <批准>“等待几个时钟周期(未使用的值)”*/
对于(i=0U;i<10U;i++)
{
}/*等待*/
regread = tced1REG->RAMUERRADDR;
regread =加扰2REG->RAMUERRADDR;
/*禁用写入 ECC RAM */
加扰1REG->RAMCTRL = 0x0005000AU;
加扰2REG->RAMCTRL = 0x0005000AU;
/*计算正确的 ECC */
加扰 A1bit =加扰 A1_bk;
加扰 A2bit =加扰 A2_Bk;
/*用户码开始(37)*/
/*用户代码结束*/
}
QJ 您好,
我们在开发过程中不使用 HalCoGen,对我来说,对上述函数的解码有点丢失。 是否有其他解释,或者在 spnu499c 中有任何地方可以看到模拟双位 SRAM ECC 错误的确切顺序和过程?
谢谢。
你好,查克,
TCRAM 受 ECC 保护,允许 CPU 纠正任何单位错误,并在64位值范围内检测双位错误。 错误纠正代码(ECC)也存储在 RAM 内存空间中。 对于从 RAM 中读取的每64位 ECC,CPU 在其 ECC 总线上也会读取8位 ECC。
ECC 内存也可以直接访问。 可以通过设置 RAMCTRL 寄存器的 ECC_WR_EN 位来启用对 ECC 空间的写入。 可以执行注射两位 ECC 错误:
0。备份要执行测试的地址的 SRAM 内容,例如0x08000032 (对齐64位)
1.启用 ECC 写入: RAMCTRL->ECC_WR_EN =1;
2.禁用 RAM ECC
3.在0x08000032处切换 SRAM 内容的2位 ECC 代码(0x08400032)
4.启用 RAM ECC
5.禁用 ECC 写入 SRAM: RAMCTRL->ECC_WR_EN =0;
6.读取 SRAM 内容(0x08000032): 从具有2位 ECC 错误的位置读取将导致数据中止
7.清除数据中止处理程序中的 ESM 错误
QJ 您好,
这更清晰。 谢谢你。 我仍然对以下代码段有问题,一旦执行第三行(ram =*(u64 *) 0x08000032;),就会生成异常中止。 你能给我启迪这一事业吗?
case 28: u64 ram; int ACTLR; ram = *(u64 *) 0x08000032; RAMCTRL1_bit.ECC_WR_EN = 1; ACTLR = __MRC(15,0,1,0,1); ACTLR &= 0xF3FFFFFF; __MCR(15,0,ACTLR,1,0,1); asm(" nop"); asm(" nop"); asm(" nop"); *(u64 *) 0x08400032 = ram ^ 0x3; ACTLR = __MRC(15,0,1,0,1); __MCR(15,0,ACTLR|0x0C000000,1,0,1); asm(" nop"); asm(" nop"); asm(" nop"); RAMCTRL1_bit.ECC_WR_EN = 0; *(u64 *) 0x08000032 = ram; break;
SRAM 是否已初始化? 可以使用专用的自动初始化硬件初始化 RAM 内存。 所有 RAM 数据存储器都被初始化为零,ECC 内存被初始化为零的正确 ECC 值,即0Ch。
是的,所有 SRAM 位置都是硬件自动初始化的。
奇怪的是,如果源代码中的所有“u64”都更改为“u32”,则一路向末尾,无异常中止。 看起来32位读写不会导致数据中止。
以下屏幕截图对初始化的 ECC 是否有意义? 某些位置的值不是0x0C。
我很抱歉。 0x08000032未与64位内存边界对齐。
请尝试 ram =*(uint64 *) 0x08000038;
并更改此行 *(u64 *) 0x08400032 = RAM ^ 0x3;
至 *(u64 *) 0x08400032 ^= 0x3;
我很抱歉。 0x08000032未与64位内存边界对齐。
请尝试 ram =*(uint64 *) 0x08000038;
并更改此行 *(u64 *) 0x08400032 = RAM ^ 0x3;
至 *(u64 *) 0x08400032 ^= 0x3;
QJ 的美好一天
我对建议的更改的测试不起作用,在整个序列后没有生成异常。
现在,为了便于内存检查,我已将该地址更改为0x08000040和 ECC 地址0x08400040,这两个地址都是8字节对齐的。 这是新序列:
下面是修改后的代码段。 什么可能是错误的?
如果您需要,我将提供记忆视图捕获。
case 32: u64 ram, err; // local variables u32 ACTLR; ram = *(u64 *) 0x08000040; // backup SRAM contents ACTLR = __MRC(15,0,1,0,1); // disable RAM ECC by ACTLR &= 0xF3FFFFFF; // clearing bits 26 & 27 __MCR(15,0,ACTLR,1,0,1); // for even and odd banks RAMCTRL1_bit.ECC_WR_EN = 1; // enable ECC RAM write *(u64 *) 0x08400040 ^= 0x3; // toggle 2 bits of ECC code (0x08400040) of SRAM contents at 0x08000040 RAMCTRL1_bit.ECC_WR_EN = 0; // disable ECC RAM write ACTLR = __MRC(15,0,1,0,1); // enable RAM ECC by ACTLR |= 0x0C000000; // setting bits 26 & 27 __MCR(15,0,ACTLR,1,0,1); // for even and odd banks err = *(u64 *) 0x08000040; // read to generate data abort exception *(u64 *) 0x08000040 = ram; // restore SRAM contents break;
QJ 您好,
请与我联系,任何帮助都将不胜感激。
卡盘。
你好,查克,
顺序看起来不错。 RAMCTRL 寄存器的其他位字段的值是多少? ECC 检测(位3~0)和奇偶校验(位19~16)是否已启用? 默认情况下启用 ECC 检测和奇偶校验。
QJ 您好,
在执行指令之前错误=*(u64 *) 0x08000040:
注册 RAMCTRL1的默认值为0x0005 000a,其中 ADDR_parity 禁用=0x5和 ECC_DETAL_EN=0xA。
注册 RAMERRSTATUS1=0x0000。
另一个相关的问题是,由于此 ECC 检查将导致双位未校正 SRAM 错误,为什么我应该期待出现数据中止异常而不是 ESM Group3错误,并声明 nError 输出信号?
我还应该配置 RAMCTRL2吗? 为什么有两组寄存器?
谢谢。
除此之外,在读取地址 0x08400040时,它是0x0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c,我认为:
双位 ECC 错误 会导致 CPU 异常中止,并将 nError 降低,并设置 ESM 3.3/3.5
[引用 userid="91537" url="~/support/icles/arm-based 微处理器组/基于 ARM 的微处理器/f/arm-based 微处理器- forume/1066050/tms570ls3137-simul模拟 SRAM -双位 ECC 错误/3967399#3967399]I 是否还应该配置 RAMCTRL2? 为什么有两组寄存器?BTCM 接口(用于 RAM)分为两部分–B0TCM 和 B1TCM。 RAMCTRL 1用于 B0TCM,RAMCTRL2用于 B1TCM。
*(volatile UINT32 *) 0x08400040U ^= 0x3;
感谢 QJ 的支持,
最后,问题是64位内存读取地址0x08000040。 相反,无论在切换2位 ECC 时是否使用了关键字 volatile,它都应该是与8位边界对齐的32位读取。
摘要说明32位 RD/WR 应用于所有访问,而不是64位。
此致!