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.

[参考译文] TMS320F28377D:从闪存读取时的数据缓存行为

Guru**** 2782615 points

Other Parts Discussed in Thread: TMS320F28377D

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1604690/tms320f28377d-data-cache-behavior-when-reading-from-flash-memory

器件型号: TMS320F28377D

我对将数据从闪存复制到 RAM 时的数据缓存行为有疑问。

*环境:**
- CPU: TMS320F28377D
-板:定制印刷电路板
-时钟频率: 200MHz(5ns/周期)
-代码段:.TI.ramfunc(从 RAM 执行)
-闪存等待状态: 3 个周期
-数据缓存:已启用
-预取:已启用

**测试已执行:**
我通过切换 GPIO13、同时使用两种不同的方法将 128 位数据从闪存(扇区 H:0x0a1700)复制到 RAM (LS5:0x00ac00)、测量了处理时间:

1.预编程指令:读取 16 位数据 8 次
2. MOVL 指令:读取 32 位数据 4 次

***测量结果:**
-预置:170ns
- MOVL: 70ns
-撤销执行顺序时结果相同
PREAD_8times.PNG

**测试代码:**
    MOVW  DP、#_GpioDataRegs

;将闪存复制到 RAM(字* 8 )
    MOVL  XAR7、#0x0a1700        ;来源   (闪存扇区 H)
    MOVL  XAR4、#0x00ac00        ;目标 (LS5 RAM)
     
    或   μ@ GpioDataRegs+2、#0x2000  ;GPIO13=高电平
     
    RPT  #7.
||   PREAD *XAR4++、*XAR7
     
    或   2 σ@ GpioDataRegs+4、#0x2000  ;GPIO13=低电平
     
    NOP
     
;将闪存复制到 RAM(双字* 4)
    MOVL  XAR7、#0x0a1700        ;来源   (闪存扇区 H)
    MOVL  XAR4、#0x00ac00        ;目标 (LS5 RAM)
     
    或   μ@ GpioDataRegs+2、#0x2000  ;GPIO13=高电平
     
L1:  MOVL  ACC、*XAR7++
    MOVL  *XAR4++、符合
L2:  MOVL  ACC、*XAR7++
    MOVL  *XAR4++、符合
L3:  MOVL  ACC、*XAR7++
    MOVL  *XAR4++、符合
L4:  MOVL  ACC、*XAR7++
    MOVL  *XAR4++、符合
     
    或   2 σ@ GpioDataRegs+4、#0x2000  ;GPIO13=低电平

**我的假设:**
对于 MOVL 指令:第一次读取会产生总共 4 个周期的等待周期(3 个周期)、而后续读取会命中高速缓存、每个只需要 1 个周期。 总计:5ns×(4+7)= 55ns
对于预编程指令:不使用高速缓存、每次读取都会出现等待周期。 总计:5ns× 4 × 8 = 160ns

**问题:**
1.这个假设是正确的吗?
2.为什么 pread 指令不使用缓存,即使数据缓存和预取都已启用?
3.是否有任何可能,我误配置的东西或使用这些指令不正确?

任何见解都将非常感谢。

提前感谢您的帮助。

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

    您好、

    很抱歉、专家目前已离职。 请期待下周稍后的回复。  

    此致、
    Aj Favela.  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    **问题:**
    1.这个假设是正确的吗?
    2.为什么 pread 指令不使用缓存,即使数据缓存和预取都已启用?
    3.是否存在任何错误配置或使用这些指令错误的可能性?

    这是正确的、原因在于实现预取的方式。  只有指令提取才会利用预取机制、因此即使预取程序总线正在使用、它也会绕过预取缓冲区、因为它不是指令获取。

    至于数据缓存、它只对数据总线访问有效、并且由于预加载强制从程序总线读取、因此在这里也不会使用。

    您是否需要在应用程序中使用预开发板有特定的原因?  由于存储器映射在 C28x 器件上统一、因此闪存数据可自由地在程序总线和数据总线上读取。  您已经注意到、使用 PREAD 的取指数据仅为 16 位、因此不如同时支持 16 位和 32 位访问的数据空间访问那么灵活。

    此致、

    Matthew

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

    尊敬的 Matthew:

    感谢您的答复。
    我现在知道、当使用 PREAD 从闪存读取数据时、使用程序总线而不是数据总线、这就是数据缓存不工作的原因。

    我在我的 C 源代码中使用 memcpy () 函数将数据从闪存复制到 RAM、但它花费的时间比我预期的要长。
    当我调查原因时、我发现装配体列表中使用了 Pread、这就是为什么我将其与 MOVL 进行性能改进比较、并发布了我的原始问题。

    根据您的解释、我有后续问题:

    1.这是否意味着使用程序总线的以下指令不使用数据缓存?
    - pread loc16,*XAR7.
    - PWRITE *XAR7, loc16
    - MAC P, loc16,*XAR7/++
    - DMAC ACC:P, loc32,*XAR7/++
    - IMACL P、loc32、*XAR7/++
    - QMACL P、loc32、*XAR7/++

    2.是否有其他没有使用数据缓存的情况?

    提前感谢您的帮助。

    此致、

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

    Toru,

    感谢您的背景。  我不知道 memcopy 使用了预编译版、但我可以看到这样的推理:利用另一条总线、这样我们就不会有从一个存储器复制到另一个存储器的恒定总线停顿。  如您所说、因此、由于缺少缓存、会出现一些效率低下的情况。

    您创建的列表也是我所知道的将在此处受到影响的内容、包括详细的 PREAD/PWRITE、以及利用程序和数据总线来提高效率的 MAC 函数。

    此致、

    Matthew