你好、冠军、
在 SDK 中的 MMW 演示中、所有运行时代码都从 L2运行。 只有初始化代码(段.overlay)从 L3运行一次、然后由 L3雷达立方体重叠。 在客户的实际情况下、L2不足以用于代码、他们需要在 L3中放置一些运行时代码。 您能帮助检查如何支持它吗? 尤其是如何从 L3高效运行代码? 启用 L2缓存并更改 MAR 以启用 L3中的代码段缓存是否需要执行此操作?
谢谢、
Adam
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.
你好、冠军、
在 SDK 中的 MMW 演示中、所有运行时代码都从 L2运行。 只有初始化代码(段.overlay)从 L3运行一次、然后由 L3雷达立方体重叠。 在客户的实际情况下、L2不足以用于代码、他们需要在 L3中放置一些运行时代码。 您能帮助检查如何支持它吗? 尤其是如何从 L3高效运行代码? 启用 L2缓存并更改 MAR 以启用 L3中的代码段缓存是否需要执行此操作?
谢谢、
Adam
尊敬的 Adam:
我对这一点的深入了解、因为 MAR 是 L2配置中的寄存器、所以我很好奇 L1D 是否也受 MAR 影响、我的回忆是、它是、但不确定、 超级模块文档(http://www.ti.com/lit/ug/sprufk5a/sprufk5a.pdf) 明确地提到、如下所述、L1D 也会受到 MAR 的影响:
--------
4.3.7.3 L1交互
当 L1P 或 L1D 向 L2请求未保存在 L2 RAM 或 L2高速缓存中的地址时、L2
控制器查询相应的 MAR 寄存器以获取该地址。 如果中的许可复制(PC)位
MAR 寄存器为0、L2高速缓存控制器将其视为不可高速缓冲的访问并启动
远程访问。 如果存取是长距离读取、CPU 会延迟、直到读取数据返回和
如果 LRU 缓存集中存在与不可缓存存储器匹配的脏数据、L1D 将会写回该数据
地址。
关于 L1D 长距离请求、MAR 中 PC 位的最终结果是防止
L2和 L1D 缓存中存储的不可缓存数据。 因此、在给定的 MAR 中、当 PC = 0时
L1D 和 L2高速缓存都不会保留在地址范围内访问的数据副本
该 MAR 涵盖。
MAR 寄存器对 L1P 没有影响。 如果启用了 L1P、它将始终缓存程序提取
不考虑 MAR 配置。
----------------------------
另请注意最后一句话、即如果您只关心 L3中没有 L2缓存配置的高效程序访问(而不是数据访问)(演示由于尝试最大化 SRAM 而不启用 L2缓存)、 那么、它已经很高效、即无需对 MAR 进行编程。 从上面(第一个语句"L1P 和 L1D...") 可以看到 MAR 对 L2的程序访问有影响、即如果未为非零 L2高速缓存设置高速缓存能力、则程序访问不会在 L2中高速缓存、它们只会在 L1P 中高速缓存。
正确、除了第1点的微小修正、您指的是"L1D 或 L2高速缓存"、而不是"L1P 或 L2高速缓存"。
此外、在使用字词时有一点细微差别:我们通常使用"代码"一词来表示程序或指令访问、但代码也可以包括将作为数据访问的只读(.const)数据表、这些表通常被视为代码的一部分。 如果未启用 MAR、则此只读数据将不会被缓存(因为它通过 L1D 而不是 L1P)、并可能导致性能下降、具体取决于访问模式。 虽然我们无需担心一致性操作方面的只读数据(无需回写或失效)、但如果未设置 MAR、则性能会下降、这与指令访问不同。 因此,在严格提及 P access 时最好使用“指令”而不是“代码”,但我也在语句中随意使用“代码”一词来表示指令,所以我首先需要遵循我自己的建议:-)。