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.

[参考译文] RTOS/TMS320C6678:当 L2配置为 SRAM 时、是否将 MSM 配置为 L1D 不可高速缓冲?

Guru**** 2583445 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/627285/rtos-tms320c6678-configure-msm-to-be-non-cacheable-in-l1d-when-l2-is-configured-as-sram

器件型号:TMS320C6678

工具/软件: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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 David:

    我已将您的疑问转发给软件专家。 他们的反馈应发布在此处。

    BR
    Tsvetolin Shulev
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我们使用的是 pdk_c667x_2_0_0。   我还找到了几种不同的方法来实现这一目的。  一种是使用 CSL_XMC_setXMPAXH()调用,另一种是直接设置寄存器。  但这对我来说是不可行的。  我确信我做了一些错误的事情,我只是不知道什么。  据我了解,MSMC 位于地址0x0C000000,但我无法为该地址设置 MAR 位以关闭缓存。  因此、我在0xA0000000处为该地址创建别名、然后为该地址设置 MAR 位。   那么、当我设置 DMA 时、我使目标地址为0xA00000000、对吧?  下面是我的代码:

     

      /*

      ** 使用 MPAX 寄存器3.

      ** 分段大小:4MB (0x15 = 0b10101)

      ** 逻辑地址:0xA000_0000 (0x00A00)

      ** 物理地址:0x0C00_0000 (MSMC)(0x000C0)

      ** 对主管和用户的保护:读、写、不执行(110110)

      ** MAR 寄存器索引0xA000_0000:160 (0xA0)

      *

      CSL_XMC_XMPAXH highStruct={0xA0000、0x15};

      CSL_XMC_XMPAXL lowStruct= {0x00C000、1、1、0、1、 1、0};

     

      CSL_XMC_setXMPAXH (3、&highStruct);

      CSL_XMC_setXMPAXL (3、lowStructt);

     

      cache_disableCaching (160);

     

     

    我还尝试了:

     

      *(((uint32_t *) 0x0800001C)= 0xA0000015;

      *(((uint32_t *) 0x08000018)= 0x00C00036;

      *(((uint32_t *) 0x01848280)= 0x00000000;

     

     

    它执行相同的操作。  我可以在存储器浏览器中查看这些地址、并看到它们正在设置。

     

    然后、我将代码更改为目标地址为0xA0000000、而不是0x0C000000。  除非什么都不发生。

     

    CorePac 和 EDMA3是否有多个 MPAX 可用于访问 MSM SRAM 的备用地址?

     

    谢谢

    David

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    EDMA3存在于任何内核之外、并且需要"全局"地址。  它也不知道有关别名的任何信息。  因此、内核0代码将使用0xA0000000地址、但在设置 EDMA3时、需要使用0x0C000000地址。  这似乎解决了我们的问题

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    David、

    您现在似乎可以禁用 MSMC 缓存。 至于内核到内核一致性、该器件上的 MSMC 不支持该功能。 因此、您必须手动管理数据交换。

    如果还有其他问题、请告知我们。

    此致

    Jian