Other Parts Discussed in Thread: HALCOGEN
主题中讨论的其他器件:HALCOGEN
工具/软件:TI C/C++编译器
您好论坛、
我对 ARM 处理器比较陌生、尝试即时检查 RAM ECC 是否存在插入错误。 我在这上面读了很多主题、但没有找到解决方案。
我已运行此帖子: e2e.ti.com/.../774180
相同的问题。 使用 HalcogGen 中的代码对我无效。 但使用 SPNA126中的值确实让我想起了一点。 我能够在通道3上生成 ESMSR3错误、但在通道5上不生成错误。 我也按照 QJ Wang 的指示操作。 我偶然发现了以下问题、不确定是否有问题:当我尝试通过 XOR 更改2位时、我注意到以某种方式更改了16位。 (我正在使用 IAR Workbench)。 请参见下图。 在第一个图中、在执行上的第96行之前、它显示在 Memory1视图中、在位置0x08400010写入2e2e_2e2e。
按 F11 (步入)一次后、给定位置的值将变为2D2D2D_2D2D。 我想引起一个双位错误、而不是改变16位。
这是第一个函数的代码、B1TCM 的第二个函数随后被调用。
void checkRamEccB0TCM (void)
{
volatile uint64 ramread = 0U;
易失性 UINT32 regread = 0U;
uint64 tcrama2_bk = tcramA2bit;
uint64 tcramb2_bk = tcramB2bit;
/*启用对 ECC RAM 的写入、启用 ECC 错误响应*/
tcram1REG->RAMCTRL = 0x0005010AU;
tcram2REG->RAMCTRL = 0x0005010AU;
// 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");//;确保在继续之前写入
/*在两个组中强制出现双位错误*/
//tcramA2bitError ^=(uint64_t) 0x00000003U;
tcramA2bitError ^= 3U;//#define tcramA2bitError (*(volatile UINT32 *)(0x08400010U))
// 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;
regread = tcram1REG->RAMUERRADDR;
/*禁用对 ECC RAM 的写入*/
tcram1REG->RAMCTRL = 0x0005000AU;
tcram2REG->RAMCTRL = 0x0005000AU;
/*计算正确 ECC */
tcramA2bit = tcramA2_bk;
tcramB2bit = tcramB2_bk;
}
Q1:更改16位是否正常、我只想更改2位。
Q2:这是否是我没有在通道5上得到误差的原因?
其他注意事项:
对于 B0TCM、数据流将跳转到引导加载程序的数据中止处理程序、然后更改为数据中止进入我处理错误的应用程序(重置 esmsr3)。
对于 B1TCM、数据流再次进入应用程序的数据中止处理程序、但当执行错误检查时、在 esmsr3中没有信号。 esmsr3的值为0x00。 应为0x20。 此外、还涉及位的变化。 在本例中、ALSE 16位发生了更改、而不仅仅是2位。 我在 RAM ECC 中使用不同的位置(0x08400010和 0x08400018)。
如果给定信息不够、我可以通过更多打印屏幕更新它、在调试时在不同的点使用寄存器值。
此致、
Mensur


