[CACHE-126] 在 cache 回写过程中可能出现 cache 命中错误

影响版本: v0.0 v0.1 v0.2

描述

当 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 及以上版本中已通过以上方法自动绕过该问题。

解决方案

暂无 修复计划。