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.

[参考译文] 切换上下文时 TMS570LC43x 重新配置 MPU 缓存设置

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1252944/tms570lc43x-reconfiguring-mpu-cache-settings-when-switching-contexts

大家好、我们目前正在着手一个项目、其中涉及使用带有裸机软件的 TMS570LC43x 微控制器。 该软件采用具有两个执行上下文的简单调度机制: 代码 A 在周期性中断处理程序中运行、而代码 B 在与代码 A 异步的后台执行。我们的目标是通过启用高速缓存来优化代码 A 的性能、同时代码 B 在禁用高速缓存的情况下运行。 代码 A 和代码 B 之间共享一些代码、这些代码将使用特定的 MPU 区域。

为了实现这一点、我们的计划是在切换到代码 A 上下文时重新配置共享代码 MPU 区域、使其成为"MPU 可高速缓存"。 然后、在转换到代码 B 时、我们将再次重新配置 MPU、使其不可高速缓存。  


不过、我们有一个问题:将 MPU 区域的设置从缓存更改为非缓存可能会使相关的缓存条目无效。 因此、我们对这种方法的安全性不确定。 我们想知道,在采取这种做法之前,我们是否应考虑到任何潜在的问题或考虑因素。

谢谢!  



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

    您好、Rama、

    我们已开始处理您的问题、并将尝试尽快提供更新。

    --

    谢谢。此致、
    Jagadish。

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

    您好、Rama、

    MPU 允许您将存储器划分为多个区域、并为每个区域设置单独的属性。 您可以将代码 A (一个或多个函数或数据段)放在具有缓存启用功能的单独 MPU 区域中。 由于运行 codeB 时不会触及缓存内容、因此应该没有问题。  

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

    您好 QJ Wang:

    感谢您的反馈。 也许只是一个跟进问题。

    我们将具有一个区域、其中的代码在上下文 A 和 B 之间共享。可从上下文 A 和 B 中执行后者。 计划在运行时按如下方式调整该区域的 MPU 设置:
    1) 1)将此 MPU 区域配置为在从上下文 B 转换到 A 时可高速缓冲的。
    2) 2)从上下文 A 转换到 B 时、将此 MPU 区域配置为不可高速缓冲。

    我们的问题是:在执行步骤2)时、此区域的缓存条目是否无效、或者在步骤1)再次执行后这些条目是否在上下文 A 中保持可用?

    谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们的问题:执行步骤2时,此区域的缓存条目是否无效,或者在步骤1)再次执行后这些条目是否仍可用于上下文 A?

    9.4款.  ARM Cortex-R 系列编程人员指南的属性和高速缓存维护包含以下注释:

    [报价]当通过重新编程 MPU 更改存储器位置的存储器类型、缓存能力或可共享性属性时、需要进行缓存维护。 然后、必须通过执行以下操作来恢复1级指令和数据缓存以及任何2级缓存(如果存在)中的一致性:
    - i-cache:全部无效。
    - D 高速缓存:全部清除并使其无效[/报价]

    在以这种方式恢复一致性的同时,无需禁用和重新启用 MPU。

    一种替代策略可能是对所有曾经可高速缓存但现在不可高速缓存的地址通过地址使无效(或对 D 高速缓存而言为清除和无效)。 但是,这通常不会提高性能。

    如果 在将 MPU 区域重新配置为不可缓存时、没有使共享代码区域中的指令缓存无效、则可能会发生未定义的行为。

    上下文 A 和 B 之间共享的代码区域有多大、允许上下文 B 缓存共享代码区域对性能有何影响?