【问题背景】
S32K3 系列的芯片SRAM0 有一段区域被设计成Standby 的RAM 可以在Standby Mode 下保持数据,本地使用Standby RAM 保持了一段数据然后触发了重启后发现数据没有保持成功跟重启前的数据不一致了。本地在重启前后分别dump 数据输出信息如下。
对比重启前后的数据发现重启后的的 Standby RAM 数据没有被更新(与预期不符)。
【问题调查】
针对该问题原因本能的怀疑是跟重启前Dcache 未写回RAM,有了怀疑点我们进行调查。本地关闭D-CACHE后复测该问题。
关闭后复测该问题,问题不在复现重启前后的Standby Ram 的数据保持一致,验证了 D-Cache 未写回是导致数据丢失的原因。
【问题修改】
上述的关闭的D-CACHE 的方式已经可以解决该问题了,但是直接关闭D-CACHE 也会牺牲CPU 的性能的代价,并非最优解我们可以在重启前刷新D-CACHE 来修复问题,添加如下的CACHE刷新接口。
#if defined (D_CACHE_ENABLE) //SCB_DisableDCache(); //SCB_CleanDCache(); SCB_CleanDCache_by_Addr((volatile void *)(&hard_fault),sizeof(hard_fault)); #endif
以上三个接口在S32K上都可以使用,添加如上代码后,开启 D-CACHE 时问题已解决,且避免了性能损耗。
【总结】
本文围绕 S32K3 系列芯片 Standby RAM 数据在重启后未保持一致的问题展开分析与解决,核心内容总结如下:
问题现象:SRAM0 中设计为 Standby 模式下可保持数据的区域,在保存数据并触发重启后,数据未成功保持,与重启前不一致。
原因定位:经排查,问题源于重启前 D-Cache 数据未写回 RAM。关闭 D-CACHE 后复测,数据保持一致,验证了该原因。
解决方案:
直接关闭 D-CACHE 可解决问题,但会牺牲 CPU 性能,非最优解;
更优方案为重启前刷新 D-CACHE,通过添加针对性的缓存刷新接口(如SCB_CleanDCache_by_Addr),在开启 D-CACHE 的情况下既解决了问题,又避免了性能损耗。