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.

[参考译文] TMS570LC4357:在启动过程中使用堆栈但在其他 RAM 访问中不使用时、ESM 组3错误(RAM ECC)-为什么?

Guru**** 2468610 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1183809/tms570lc4357-esm-group-3-error-ram-ecc-when-using-stack-in-startup-but-not-on-other-ram-access---why

器件型号:TMS570LC4357

您好!

我看到以下问题。 添加橙色行时、会在栈上放置一个变量、并抛出 ECC 错误。 但是 、我还修改了 memInit 以执行类似的访问、这不会导致任何问题。 我的问题 归结为"为什么这些与芯片中的 ECC 检查功能不同?" 我将包括 HL_SYS_STARTUP.c 的更改和 HL_SYS_CORE.asm 的更改

hL_sys_startup.c 放置在下面、带有橙色的模块、会跳过某些实体/替换 为省略号(...) 在最后显示 ESM 组3通知检查的相关代码之后、我注意到这一点:
```μ A

void _c_int00 (void)

寄存器 resetSource_t rstSrc;
/*用户代码开始(5)*/
/*用户代码结束*/

/*初始化内核寄存器以避免 CCM 错误*/
_coreInitRegisters_();

/*初始化堆栈指针*/
_coreInitStackPointer_();

/*复位处理程序:以下指令从系统异常状态寄存器中读取
*以确定 CPU 复位的原因。
*
rstSrc = getResetSource();

uint32_t * reset_cause =(uint32_t *) reset_cause;

* RESET_CAUS=(uint32_t) rstSrc;

switch (rstSrc)

默认值:

/*初始化 L2RAM 以避免在上电后立即出现 ECC 错误*/
memInit_();

(笑声)

_coreEnableEventBusExport_();

/*用户代码开始(10)*/
/*用户代码结束*/

/*检查加电期间是否存在 ESM 组3错误。
*这些可能发生在电子保险丝自动加载期间或从闪存 OTP 读取期间
*在加电期间。 器件运行不可靠、不建议这样做
*。 *
if ((esmREG->SR1[2])!= 0U)

esmGroup3Notification (esmREG、esmREG->SR1[2]);


/*初始化系统-时钟、闪存设置、带 Efuse 自检*/
systemInit();
```μ A

hL_sys_core.asm:
```μ A

;------------------------------------------------------------------
;初始化 RAM 内存

;将引导加载程序和应用程序通信对象存储到中
; CPU 寄存器,以避免被内存初始化擦除
; ECC 所需的例程

.def _memInit_
asmfunc

memInit_

LDR r0,内部通信;将内部通信(地址)加载到 r0
LDR R6,[r0,#0];将内部通信保存到寄存器中
LDR r7、[r0、#4];将 RESET_CAUSTER 保存到寄存器中
LDR R8,[r0,#8];将 UPDATE_STATUS 保存到寄存器中
LDR R9、[r0、#12];将 vector_table_ptr 保存到寄存器中
LDR R12、MINITGCR;载入 MINITGCR 寄存器地址
LDR R12、MINITGCR;载入 MINITGCR 寄存器地址
MOV R4、#0xA
STR R4,[R12];启用全局存储器硬件初始化

LDR r11、MSIENA;载入 MSIENA 寄存器地址
MOV R4、#0x1;MSIENA 的位位置0对应于 SRAM
STR R4,[r11];为 SRAM 启用自动硬件斜体化
mloop;循环直到内存硬件初始化指令
LDR R5、MSTCGSTAT
LDR R4、[R5]
TST R4、#0x100
beq mloop

MOV R4、#5
STR R4,[R12];禁用全局内存硬件初始化
STR R6,[r0,#0];将内部通信放回
STR r7、[r0、#4];将 RESET_CAUST 放回
STR R8、[r0、#8];将 UPDATE_STATUS 放回
STR R9、[r0、#12];将 vector_table_ptr 放回
BX LR

内部通信.word 0x0807FFF0
RESET_CAUSE_WORD 0x0807FFF4
update_status .word 0x0807FFF8
vector_table_ptr .word 0x0807FFFC
endasmfunc
```μ A

为什么 HL_SYS_STARTUP.c 的更改会导致 ESM 组3 (寄存器读取0x08)错误、但 HL_SYS_CORE.asm 的更改不会导致此错误? 这种情况很容易重现、因为从电源应用中、该错误取决于 HL_SYS_STARTUP.c 的更改 但是、我无法解释它、因为我希望  HL_SYS_CORE.asm 的更改在启动序列的同一时刻在内存上运行。 可能值得注意  的是、HL_SYS_STARTUP.c 的更改在 HL_SYS_CORE.asm 中的新代码之前写入栈、但我无法解释写入栈会导致 ECC 错误、除非有其他事务正在进行。

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

    您好!

    在访问 L2RAM 之前、应对其进行初始化、以避免 ECC 错误。

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

    那么、为什么_memInit_周围的橙色数据访问不会导致错误? 我们需要通过 memInit 保留少量数据、我不知道如何判断 L2RAM 是否已初始化。

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

      memInit_()中的橙色部分不访问 L2RAM。 它使用 MCU 寄存器(R0、R1、...)。