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.

[参考译文] 编译器/TMS570LS3137:不生成 B1TCM 的双位错误。

Guru**** 2614285 points

Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/777332/compiler-tms570ls3137-double-bit-error-for-b1tcm-is-not-generated

器件型号:TMS570LS3137
主题中讨论的其他器件: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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我编辑了该帖子。 第一次没有看到我的屏幕快照没有贴附。

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

    您好 Mensur、

    我需要在 LS3137板上进行测试。 我很快会回来的。

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

    您好、Mensur、

    刚刚对 LS3137 HDK 进行了测试。 从0x08000018读取数据时 、我得到 ESM3.5错误:RAM 奇数组(B1TCM)- ECC 不可纠正的错误。

    我使用 HALCoGen 生成的 sys_selftest.c 中的函数。

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

    Q1:更改16位是否正常、我只想更改2位。

    这是预期的。 在 RAM ECC 区域中、64位位置用于8位数据 ECC、因此 ECC 是重复的。 在0x084000000包含8位 ECC、用于0x08000000处的64位数据、字节0/2/3/4/5/6/7相同。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    QJ Wang、您好!

    感谢您的回复。 现在、我运行了 HALCOGEN 中的_coreEnableRamEcc_和其他函数、但仍然看不到 B1TCM 的错误。 不过、我进入数据中止状态、但在 ESMSR3寄存器中没有发出通道5错误信号。 我还使用了您的代码片段。 它可能必须对某些寄存器中的某些位进行重新置位或置位。

    您是否可以共享自己的工作项目(特别是数据中止处理程序和初始化部分)?

    此致、

    Mensur Kujovic

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

    您好、再说一次、

    我使它正常工作。 我在 RAMERRSTATUS 寄存器中添加了 ADDR_DEC_FAIL 标志的清零。

    /*启用对 ECC RAM 的写入、启用 ECC 错误响应*/
    tcram1REG->RAMCTRL = 0x0005010AU;
    tcram2REG->RAMCTRL = 0x0005010AU;
    
    _coreEnableEventBusExport_();
    
    /*导致2位 ECC 错误*/
    _coreDisableRamEcc_();
    tcramA2bitError ^= 0x3U;
    tcramB2bitError ^= 0x3U;
    _coreEnableRamEcc_();
    
    /*从具有2位 ECC 错误的位置读取数据这将导致生成数据中止*/
    ramread = tcramA2bit;
    tram1REG->RAMERRSTATUS |= 0x4U;//清除 ADDR_DEC_FAIL 标志
    tram2REG->RAMERRSTATUS |= 0x4U;//清除 ADDR_DEC_FAIL 标志
    ramread = tcramB2bit;
    tram1REG->RAMERRSTATUS |= 0x4U;//清除 ADDR_DEC_FAIL 标志
    tram2REG->RAMERRSTATUS |= 0x4U;//清除 ADDR_DEC_FAIL 标志
    

    我会将其标记为"已解决"。 但我唯一的问题是、或者更好地说、我想知道为什么我要在我的代码中添加这个代码、而在你的代码片段中、这是不必要的?

    我缺少什么吗?

    此致、

    Mensur K

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

    为什么设置 ADDR_DEC_FAIL 标志? 是否设置了 ADDR_COMP_LOGIC_FAIL 标志? 您是否也进行了地址解码测试? ABORT.asm 函数将 RAMERRSTATUS 寄存器的 DERR 位清零。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     您好、Wang、

    我们在 引导加载程序 dabort.asm 中发现了一个寄存器错误。  B1TCM 的组3 ESMSR3错误在引导加载程序中未复位、因此在运行时无法捕获新错误。

    解决此问题后、2bit 错误测试现在是可重复的。

    感谢你的帮助。

    问题已解决。

    此致、

    Mensur K