工具/软件:TI-RTOS
我们有一个运行在 Core 0上的主程序和运行在 Core 1-5上的“helper”程序。 核心1-5计划是相同的。 内核0上的主程序放入供内核1-5程序使用的 MSM 数据、并在 MSM 中返回结果。 每个 Core 在 MSM 中都有自己的位置,因此它们无需相互“协调”。 我们使用 Semaphore2机制实现内核0和帮助器之间的同步。
此外,值得注意的是,我们没有任何 DDR 内存。 所有程序都从各自的 L2存储器中运行。 因此、所有 L2存储器都配置为 SRAM、其中没有一个配置为高速缓存。
我认为我发现,当 L2配置为 SRAM 时,MSM 会自动配置为由 L1D 缓存。 这就带来了一个问题、即如果 Core 0将数据写入 MSM、则如果之前读取的数据在其 L1D 中、Core 1-5将不会看到此新数据。 如果内核1-5写入数据、而内核0想要读取数据、则会发生同样的情况。
使用 DMA 时也会发生同样的情况。 而且我们正在进行大量的 DMA 处理。
当然,解决方法是在读取 MSM 中的位置之前“使 L1D 无效”。 但这将是一个难题、因为内核0和内核1-5在整个代码中的许多地方都能从 MSM 读取大量内容。 它将会导致许多无效。
我们还可以完全使所有 L1D 缓存无效、但 L1D 可用于加快处理速度、而且我们还具有非常严格的时序要求、因此我们希望能够充分利用 L1D。
完美的解决方案是将 MSM 配置为“不可高速缓冲”。 我可以在 VxWorks 和我曾经使用过的所有其他 RTOS 中执行此操作。 但是从阅读论坛中的其他文章和浏览 TI 文档来看、TI-RTOS 似乎无法做到这一点。 我甚至在论坛中看到了 TI 的回复,他们说不可能关闭选择性内存区域的缓存。 仅使其无效、每次您想读取时都必须执行此操作。
因此、归结为一个问题: 当 L2用作 SRAM 时、是否可以将 MSM 配置为不可缓存的 L1D?
谢谢、
David Hague