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.

[参考译文] TMS570LC4357:模拟高速缓存的锁定机制

Guru**** 2477065 points
Other Parts Discussed in Thread: TMS570LC4357, LAUNCHXL2-570LC43

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/986752/tms570lc4357-simulate-a-lock-mechanism-for-the-cache

器件型号:TMS570LC4357
主题中讨论的其他器件: LAUNCHXL2-570LC43

你好

 

我对 TMS570LC4357有疑问。

 

我们无法使用缓存替换机制操作缓存、因为在最坏的情况下、缓存的性能低于没有缓存的性能、这对于安全关键型系统是不可接受的。 因此、我们计划模拟锁定机制、以使用该处理器的数据和指令高速缓存。 为了实现这一目标,我们计划采取以下行动:

 

  • 可高速缓存的 MPU 区域限制为高速缓存的大小、以避免高速缓存缺失。
  • 在软件初始化期间、数据和指令被加载到高速缓存中。

 

问题:

  • 对于要加载到缓存中的指令、我们计划在初始化期间执行所有指令、以便将它们加载到指令缓存中。 此过程是否足以确保始终将这些指令确定性加载到缓存中?
  • 对于要加载到缓存中的数据、我们计划在初始化期间写入所有数据、以便将其加载到数据缓存中。 此过程是否足以确保始终将此数据集确定性加载到高速缓存中?
  • 检查将一组数据或指令加载到缓存中的最佳方法是什么?
  • 要加载到缓存中的指令是否可以分配给两个不连续的段? 例如8 KB 中的一个、24 KB 中的另一个。 由于对齐、缓存行(8个字= 32个字节)是否会出现问题?

 

此致、感谢您的支持!!

 

Mathieu

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

    您好!

    我认为上述方法可以确保 I$和 D$在应用程序执行期间保留其内容。 我正在尝试与 ARM 确认上述方法是否足以确保不会为任何对可缓存区域的访问重新填充缓存。 敬请期待。

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

    您好、Sunil、

    您还能向 ARM 澄清一下缓存的假随机替换策略到底是如何工作的?

    我知道高速缓存行包含四个块。

    方案:如果将内存块分配到具有3个空闲块和一个已使用块的高速缓存行中,则策略如何工作? 随机(非确定性且可以分配所使用的块)或它分配其中一个空块。

    谢谢你

    Mathieu

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

    您好!

    ARM 的响应符合预期。 我将从支持票证粘贴该线程、如下所示:


    > Cortex-R5F 上的缓存内容不能被锁定。 为了克服这种情况,我们计划:
    >-将可缓存区域定义为与可用的 I$和 D$大小相同,两者均为32kB
    >-将需要缓存的指令和数据载入 I$和 D$

    首先、我想澄清一下您已经了解的内容、缓存本质上是非确定性的。 我假设您的 Cortex-R5不执行 TCM、或者它们已满? TCM 存储器的属性似乎正是您在这里需要的? 您还知道、Cortex-R5不支持高速缓存锁定。  

    首先让我给你们一个架构答案、这最终将是唯一一个获得了 Arm 批准的答案、因为这一答案的其余部分将基于任何未经验证的理论和假设。  

    请参阅最新的 Armv8-A 架构参考手册中的"B2.2.2高速缓存行为"部分。

      https://developer.arm.com/documentation/ddi0487/latest/

    高速缓存的一般行为
    当存储器位置标记有 Normal 可高速缓存的存储器属性时、确定是否是的副本
    存储器位置保存在高速缓存中仍然取决于实现的许多方面。 如下所示
    可能涉及的因素清单不详尽:
    •高速缓存的大小、行长度和关联性。
    •高速缓存分配算法。
    •可访问存储器的系统其他元素的活动。
    •推测指令提取算法。
    •推测数据提取算法。
    •中断行为。

    考虑到这一系列因素、以及可能实现的各种高速缓存系统、架构
    无法保证:
    •高速缓存中存在的内存位置仍保留在高速缓存中。
    •高速缓存中不存在的内存位置将进入高速缓存。

    相反、以下原则适用于缓存的行为

    不能依赖高速缓存中的未锁定条目来保留在高速缓存中。 如果未锁定的条目仍保留
    在高速缓存中、不能依赖它来保持与其余存储器的不一致性。 换言之、就是软件
    不能假定保留在缓存中的未锁定项目仍然脏污。

    没有任何机制可以保证内存位置不能分配给已启用的高速缓存
    任何时候、如果存储器位置同时:
    —拥有的权限意味着可以通过读取或写入访问翻译方案
    在当前权限级别或更高权限级别。
    —标记为该翻译制度的可缓存。

    因此,答覆中的其他答案都是纯理论的,是以我们最理解的假设为基础的。 它们将不会得到验证。 您有责任验证您的要求、您知道我们可能会有一些临界情况、这些情况会导致以与缓存最初意图一致的非确定性行为进行驱逐和分配。  

    1)对于要加载到缓存中的指令、我们计划在初始化期间执行所有指令、以便将它们加载到指令缓存中。 此过程是否足以确保始终将这些指令确定性加载到缓存中?

    我认为 、假设覆盖(4GB - 32KB)的 MPU 区域将存储器定义为不可高速缓存和/或 XN (从不执行)、这是可能的。 在这种情况 下、用于数据的32KB 区域需要是 XN、而涵盖(4GB - 64KB)的其他 MPU 区域需要是不可高速缓存的。  

    2)要将数据加载到高速缓存中、我们计划在初始化期间写入所有数据、以便将其加载到数据高速缓存中。 此过程是否足以确保始终将此数据集确定性加载到高速缓存中?

    理论上、覆盖32KB 指令的 MPU 区域可由于推测而被分配到数据高速缓存中。  

    也就是说 、以32KB 指令区域中的地址为目标执行的加载可能会导致数据缓存中的一行被逐出。  

    在中、分支预测器不可能指向不正确的位置、如果该错误的位置碰巧是从 指令区域中的某个位置读取的随机操作码、则可能导致不必要的数据区域分配。

    也就是说、如果您的指令区域仅包含已知操作码、未使用的存储器可能包含 NOP 或 UDF、我确实认为这种情况不太可能发生。  

    3)> 3)检查一组数据或指令是否已加载到缓存中的最佳方法是什么?

    在 Cortex-R5上、没有到内部高速缓存 RAM 的直接访问。 我怀疑使用 PMU 来监控访问延迟可能是一个好的机制。

    4)> 4)要加载到缓存中的指令是否可以分配给两个不连续的段? 例如8 KB 中的一个、24 KB 中的另一个。 由于对齐、缓存行(8个字= 32个字节)是否会出现问题?

    MPU 允许以低至 32字节的粒度定义区域。 但是、区域地址确实需要与区域大小对齐。 我看到8KB 和16KB 的区域大小支持、因此您需要3个 MPU 区域来实现这一点。  

    同样、您还需要确保 每个区域中地址的设置索引不会重叠。 PA[12:5]用于索引到4路 32KB L1指令缓存中。

    我认为你的申请将需要更有保证的确定性,然后在答复中提出。 因此、我强烈建议使用 TCM 存储器 或连接到 LLPP 的 RAM 来获取确定性数据(尽管这可能会略微降低性能、并且不支持指令提取)、甚至类似于外部 L2C-310、因为它支持锁定。


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

    您好、Sunil、

    感谢您的回答!

    请问您能回答我的问题吗?

    "您还能向 ARM 澄清一下缓存的假随机替换策略到底是如何工作的?

    我知道高速缓存行包含四个块。

    方案:如果将内存块分配到具有3个空闲块和一个已使用块的高速缓存行中,则策略如何工作? 随机(非确定性的、可以分配所使用的块)或它分配其中一个空块。"

    此致

    Mathieu

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

    如我们观察到一个临界情况、我希望获得有关您对项目2的回答的更多详细信息。

    配置:

    MPU 区 X 包含指令、从0x0005E000开始、大小为8KB、可缓存。

    MPU 区 Y 包含指令、从大小为24KB 的0x00200000开始、可缓存。

     

    情况1:执行区域 X、n 次的所有指令。 在第一次迭代期间、使用 PMU 观察到256个缓存缺失。 在其他迭代中、未观察到缺失。

    情况2:执行区域 Y、n 次的所有指令。 在第一次迭代期间、PMU 检测到768个缓存缺失。 在其他迭代中、未观察到缺失。

    案例3:执行 X 和 Y 区域的所有指令、n 次。 在第一次迭代期间、PMU 观察到1024个缓存缺失。 在其他迭代中、每次迭代有一到两次缺失。

    情况4:执行 X 和 Y 区域的所有指令(每个区域的最后32字节除外)、n 次。 使用 PMU 在第一次迭代期间观察到1022个缓存缺失。 在其他迭代中、未观察到缺失。

    我们无法理解案例3。 指令高速缓存缺失是由相邻区域中的分支预测读数引起的、还是由高速缓存已满引起的?

    周末愉快!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="35035" URL"~/support/microcontrollers/other/f/other-microcontrollers-forum/986752/tms570lc4357-simulate-a-lock-mechanism-for-the-cache/3651426 #3651426"]在 Cortex-R5上,不能直接访问内部高速缓存 RAM。

    TMS570LC4357:如果缓存被禁用、L1缓存存储器可用作暂存存储器? 是之前对禁用缓存并直接访问缓存存储器的调查。 结论是、直接存取高速缓存存储器只是为了支持高速缓存存储器的功能测试、而不是用于程序的一般用途。 例如 、快速背靠背写入似乎是一个问题、导致缓存存储器无法正确更新。

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

    感谢切斯特的推荐! 我 也 知道 这个线程。 我们目前正在审查可高速缓冲的区域边界的临界情况。 我们的最佳猜测是分支预测会导致缓存缺失、但我们不知道原因、可能是 因为操作码无效。

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

    ARM 明确表示 Cortex R5不支持锁定高速缓存内容、不保证这种方法(可高速缓存区域大小=高速缓存大小)始终有效。 缓存本身不是确定性的、这种特定的使用模式尚未在 ARM 上验证(也未计划)。 ARM 也不支持与此相关的任何其他技术问题(如预期)。

    您可以尝试禁用分支预测、看看这是否会影响行为。

    有关禁用分支预测的信息、请参阅此页面 :https://developer.arm.com/documentation/ddi0460/c/Prefetch-Unit/Controlling-instruction-prefetch-and-program-flow-prediction?lang=en

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

    您好、Sunil、

    正如已经编写的那样、案例4表明高速缓存可以确定地运行。 我们需要了解将某个区域的最后32个字节加载到缓存中导致缓存缺失时会发生什么情况。 为此、我需要 TI 的支持。

    请回答我之前一个帖子中未解决的问题(假随机替换策略)。

    谢谢你

    Mathieu

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

    您好、Mathieu、

    请直接向 ARM 提交支持案例: https://developer.arm.com/support

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="464967" URL"~/support/microcontrollers/other/f/other-microcontrollers-forum/986752/tms570lc4357-simulate-a-lock-mechanism-for-the-cache/3654186 #3654186"]

    案例3:执行 X 和 Y 区域的所有指令、n 次。 在第一次迭代期间、PMU 观察到1024个缓存缺失。 在其他迭代中、每次迭代有一到两次缺失。

    情况4:执行 X 和 Y 区域的所有指令(每个区域的最后32字节除外)、n 次。 使用 PMU 在第一次迭代期间观察到1022个缓存缺失。 在其他迭代中、未观察到缺失。

    我们无法理解案例3。 指令高速缓存缺失是由相邻区域中的分支预测读数引起的、还是由高速缓存已满引起的?

    [/报价]

    作为一项学习练习、我尝试根据描述重新创建您的测试。

    在附加的工程中、PMU 用于报告   前两个测试迭代以及发生缺失的任何其他迭代的 PMU_INST_Cache_Miss / PMU_INST_Cache_access / PMU_cycle_count 计数。

    根据您的案例3得出的测试结果:

    iter 1 Region X size:0x2000 Region Y size:0x6000
      After region X instructions: miss=256 access=1024 cycles=5949
      After region X+Y instructions: miss=1024 access=4096 cycles=23145
    
    iter 2 Region X size:0x2000 Region Y size:0x6000
      After region X instructions: miss=0 access=1024 cycles=2359
      After region X+Y instructions: miss=0 access=4096 cycles=8797

    在接下来 的4、744、585次迭代中、没有其他缺失。  

    根据您的案例4测试结果:

    iter 1 Region X size:0x1fe0 Region Y size:0x5fe0
      After region X instructions: miss=256 access=1021 cycles=5927
      After region X+Y instructions: miss=1024 access=4090 cycles=23101
    
    iter 2 Region X size:0x1fe0 Region Y size:0x5fe0
      After region X instructions: miss=0 access=1022 cycles=2325
      After region X+Y instructions: miss=0 access=4092 cycles=8729

    在接下来 的3、378、403次迭代中没有进一步缺失。

    我没有重复您在第3种情况下的问题、即在第一次迭代后、指令占用整个32KB 高速缓存的情况下不会出现任何缺失。

    但是、这可能归结于缓存中的指令;为了使测试保持简单、每个 MPU 区域创建了一个函数、该函数仅包含 nops、后跟最终的 BX LR。 根据指令、Cortex-R5 预取单元(PFU)的运行方式可能会有所不同。

     我的测试程序可以在 LAUNCHXL2-570LC43中运行、现已附加。

    e2e.ti.com/.../TMS570LC4357_5F00_cache_5F00_lock.zip

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

    非常感谢切斯特再现我们的测试!! 我们正在检查您和我们的计划以了解差异。 我们会告诉您。