Other Parts Discussed in Thread: UNIFLASH, HALCOGEN
首先我想使用芯片的ECC功能,包括FLASH ECC,RAM ECC,我想知道如何对FLASH或者RAM使能ECC功能,并且想知道如何通过代码验证该ECC功能的测试(换句话说,是否有方法能模拟ECC单错来验证ECC的单错纠正功能,是否有方法模拟ECC双错来验证ECC的双错检测功能)
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.
首先我想使用芯片的ECC功能,包括FLASH ECC,RAM ECC,我想知道如何对FLASH或者RAM使能ECC功能,并且想知道如何通过代码验证该ECC功能的测试(换句话说,是否有方法能模拟ECC单错来验证ECC的单错纠正功能,是否有方法模拟ECC双错来验证ECC的双错检测功能)
所有到片载闪存和 SRAM 的访问由专用的单位纠错双位错误检测(SECDED)逻辑保护。 每64位数据有一个8位 ECC。 闪存存储器内容的 ECC 需要由 CCS、Uniflash 或引导加载程序等外部工具计算、后者使用闪存 API 对应用程序映像进行编程。
Cortex-R4F CPU 内的 SECDED 逻辑缺省情况下不启用并且必须由应用启用。 通过 HALCoGen 生成的驱动程序包含用于启用 ECC 的 API:
/* Disable RAM ECC before doing PBIST for Main RAM */
_coreDisableRamEcc_();
/* Enable ECC checking for TCRAM accesses.
* This function enables the CPU's ECC logic for accesses to B0TCM and B1TCM.
*/
_coreEnableRamEcc_();
/* Enable CPU ECC checking for ATCM (flash accesses) */
_coreEnableFlashEcc_();
当 CPU 在从闪存或 SRAM 存储器读取时检测到 ECC 单位或双位错误时,它会在专用的“事件”总线上发出此信号,并将 ECC 错误报告给 ESM。 默认情况下、该事件总线信号也不启用、必须由应用启用:
/* Enable CPU Event Export */
/* This allows the CPU to signal any single-bit or double-bit errors detected
* by its ECC logic for accesses to program flash or data RAM.
*/
_coreEnableEventBusExport_();
要测试 RAM 访问的 CPU ECC 机制、请参阅安全诊断库中的 SRAM 自检功能:
boolean SL_SelfTest_SRAM(SL_SelfTestType testType, boolean bMode, SL_SelfTest_Result* sram_stResult)
该函数会破坏 ECC 中的1或2位、从而导致 TCRAM 访问中故意的单位和双位错误。 当 ECC 中出现2位错误时、从 TCRAM 位置读取会导致数据中止异常。
/* Run 1Bit ECC test on TCM RAM */
retVal = SL_SelfTest_SRAM(SRAM_ECC_ERROR_FORCING_1BIT, TRUE, &failInfoTCMRAM);
/* Run 2Bit ECC test on TCM RAM */
retVal = SL_SelfTest_SRAM(SRAM_ECC_ERROR_FORCING_2BIT, TRUE, &failInfoTCMRAM);
下面是安全诊断库的链接:
https://www.ti.com/tool/SAFETI_DIAG_LIB
HALCOGen 链接:
https://www.ti.com/tool/HALCOGEN?keyMatch=HALCOGEN
Uniflash 链接:
非常感谢Ben Qin的回复与解答!
1.针对_coreEnableEventBusExport_();
我想再次问一下enable了这个事件总线后,如果发生了ECC单错或者双错,它会进入哪个中断函数吗或者是某个错误事件函数?
2.我按照你的方法尝试了启用FLASH ECC校验功能,并且故意制造了单错和双错,但是我一运行FLASH读取操作,程序便跑飞了,跳转到底层的汇编代码里:
flashErrorReal 这里,请问这是为什么,如何解决这个问题让程序继续跑下去
flashErrorReal b flashErrorReal ;branch here forever as continuing operation is not recommended esmsr3 .word 0xFFFFF520 ramctrl .word 0xFFFFF800 ram2ctrl .word 0xFFFFF900 ram1errstat .word 0xFFFFF810 ram2errstat .word 0xFFFFF910 flashbase .word 0xFFF87000 .endasmfunc
再次感谢Ben Qin!
你好,
1.针对_coreEnableEventBusExport_();
如果启用了事件总线导出、ECC 错误也将报告给 ESM 模块。 如果 ESM 通道的中断被启用,对,它将进入 ESM 中断例程。 默认的中断处理程序是低优先级 ESM 中断,它在默认情况下被禁用。
ESM 组2通道的中断一直被启用、并且高优先级 ESM 中断处理程序(ESM FIQ)被使用:
2.我按照你的方法尝试了启用FLASH ECC校验功能,并且故意制造了单错和双错,但是我一运行FLASH读取操作,程序便跑飞了,跳转到底层的汇编代码里:
这是在预期内的。 双闪存 ECC 错误将生成数据中止。 因此、调用数据中止中断处理程序。 如果 ECC 由闪存或 SRAM ECC 自检生成、则错误标志将被清除、然后代码执行跳回到自检函数。
如果自检未生成 ECC 错误、则会调用 flashErrorReal。 数据中止是一个严重错误、您必须停止代码执行才能调试代码。