Other Parts Discussed in Thread: HALCOGEN
主题中讨论的其他器件:HALCOGEN
您好论坛、
我正在使用 TMS570LS3137DZWT 并开发一个运行时间超过24小时的 EN50129应用。 因此、我想检查是否存在有效的 SRAM ECC。 我用 SPNA126和 Halcogen 4.07作为起点。
数据中止处理程序用于检查是否存在双位故障(esmr3)
执行以下步骤:
1) 禁用 B0TCM 和 B1TCM 的 RAMECC;
2) ECC RAM 中的双位翻转;[#define tcramA2bitError (*(volatile UINT32 *)(0x08400010U);#define tcramB2bitError (*(volatile UINT32 *)(0x08400018U))]
3) 为 B0TCM 和 B1TCM 启用 RAMECC;
4) 从 RAM 读取 B0TCM 的故障位置[#define tcramA2bit (*(volatile uint64 *)(0x08000010U));#define tcramB2bit (*(volatile uint64 *)(0x08000018U))]
5) -->数据中止处理程序确认 esmr3位3 (B0TCM 上的不可纠正的 ECC 错误)
6) 从 RAM (
7) -->数据中止处理程序应该确认 esmr3位5 (B1TCM 上的不可纠正的 ECC 错误),但是 esmr1、esmr2、esmr3都为0,没有要清除的内容。
我的测试函数现在会查找到
(笑声)
volatile uint64 ramread = 0U;
易失性 UINT32 regread = 0U;
//uint32 tcram1ErrStat、tcram2ErrStat = 0U;
uint64 tcrama1_bk = tcramA1bit;
uint64 tcramB1_bk = tcramB1bit;
uint64 tcrama2_bk = tcramA2bit;
uint64 tcramb2_bk = tcramB2bit;
/*在设置 RAMTHRESHOLD 寄存器之前清除 RAMOCUUR */
tcram1REG->RAMOCCUR = 0U;
tcram2REG->RAMOCCUR = 0U;
/*将单位错误阈值计数设置为1 */
tcram1REG->RAMTHRESHOLD = 1U;
tcram2REG->RAMTHRESHOLD = 1U;
/*启用单个位错误生成*/
tcram1REG->RAMINTCTRL = 1U;
tcram2REG->RAMINTCTRL = 1U;
/*启用对 ECC RAM 的写入、启用 ECC 错误响应*/
tcram1REG->RAMCTRL = 0x0005010AU;
tcram2REG->RAMCTRL = 0x0005010AU;
//第2部分
// coreDisableRamEcc
asm ("MRC P15、#0、R1、C1、c0、#1");
asm ("MVN R0、#0x1<<26");//;B0TCM ECC 检查禁用
asm ("和 R1、R1、R0");
asm ("MVN R0、#0x1<<27");//;B1TCM ECC 检查禁用
asm ("和 R1、R1、R0");
asm ("DMB");
asm ("MCR P15、#0、R1、C1、c0、#1");
asm ("isb");//;确保在继续之前写入
asm ("MRC P15、#0、R1、C9、C12、 0");
asm ("MVN R0、#0x00000010");//;禁用 PMNC 中事件的导出
asm ("和 R1、R1、R0");
asm ("DMB");
asm ("MCR P15、#0、R1、C9、C12、 0");
asm ("isb");//;确保在继续之前写入
// asm ("MOV PC、LR");
/*在两个组中强制出现双位错误*/
tcramA2bitError ^= 3U;
tcramB2bitError ^= 3U;
// coreEnableRamEcc
asm ("MRC P15、#0、R1、C9、C12、#0");//读取辅助辅助辅助辅助寄存器
asm ("ORR R1、R1、#0x00000010");
asm ("DMB");
asm ("MCR P15、#0、R1、C9、C12、#0");//;启用 PMNC 中事件的导出
asm ("isb");//;确保在继续之前写入
asm ("MRC P15、#0、R1、C1、c0、 1");
asm ("ORR R1、R1、#0x1 <<26");//;B0TCM ECC 检查使能
asm ("ORR R1、R1、#0x1 <<27");//;B1TCM ECC 检查使能
asm ("DMB");
asm ("MCR P15、#0、R1、C1、c0、 1");
asm ("isb");
/*读取损坏的数据以生成双位错误*/
ramread = tcramA2bit;//#define tcramA2bit(*(volatile uint64 *)(0x08000010U))
ramread = tcramB2bit;//#define tcramB2bit(*(volatile uint64 *)(0x08000018U))
问题1:上述 ECC 使能代码是否正确? (在文档 SPNA126;第3.3.2章(禁用 ECC 的步骤)中,_disable_ecc_r4_RAM 的代码不完整,所以我不确定 coreEnableRamEcc 是否正确。
Q2:启用 ECC 检查是否正确?
Q3:为什么从故障 B0TCM 地址读取数据正常工作(出现 esmr3数据中止错误)? 从 B1TCM (tcrB2bitError)读取会导致数据中止而不会出现 esmr3错误、因此在数据中止处理程序(来自 halcogen 4.07)中不会报告 noRAMerror。
问题4:此问题是否与以下帖子有关:
此致
Lorenz