您好!
我看到以下问题。 添加橙色行时、会在栈上放置一个变量、并抛出 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 错误、除非有其他事务正在进行。