[CACHE-126] 在 cache 回写过程中可能出现 cache 命中错误
描述
当 cache 正在进行回写时,如果此时 CPU 访问该 cache 行中的其他地址,访问请求会被当作 cache 缺失,触发缺失处理模块从外部存储器重新加载该 cache 行,导致同一 cache 路中存在两份相同的 cache 数据。
由于硬件逻辑问题,cache 命中逻辑会选择错误的 cache 数据,导致 CPU 返回错误结果。如果 CPU 还对该 cache 行进行了写入,有可能导致此次回写的数据丢失。
例如,以下情况可能导致 ESP32-S3 cache 命中错误:
在中断内访问正在被 cache 回写的 cache 行中的数据:
在 cache 回写过程中,CPU 等待回写完成信号时,发生中断请求并进入中断处理程序,且访问同一个缓冲区的内存。若处理程序访问的数据与回写地址位于同一 cache 行,可能导致 cache 命中错误。
多核场景冲突:
在多核环境中,CPU0 等待 cache 回写完成时,若 CPU1 访问了相同的 cache 行地址,可能导致 cache 命中错误。
变通方法
在 cache 回写过程中,建议用户同时增加以下两个保护措施:
关闭当前 CPU 的中断,等待 cache 回写结束后再打开。
开启 cache 冻结 (freeze) 功能,暂停另一个 CPU 访问 cache。
在 ESP-IDF v4.4.6+, v5.0.4+, v5.1.1+, v5.2 及以上版本中已通过以上方法自动绕过该问题。
解决方案
暂无 修复计划。