NXP MCU 技术论坛
直播中

李丽

7年用户 1398经验值
私信 关注
[问答]

i.MXRT1060外部闪存:使用AHB访问FlexSPI的速度问题求解

我无法理解 FlexSPI AHB RX 缓冲区的工作原理,并且在从外部 QSPI 闪存执行代码时性能意外大幅下降。我使用的开发板是 MIMXRT1060-EVKB。
我正在测试的代码是一个非常简单的 for 循环,周期性地切换 gpio 和 led:for (uint32_t time=0; time < us; time++) { }。它在内存中占用 20 个字节。闪存的行为就好像每 32 字节就有一个屏障,穿过它时会导致性能下降,并且好像 AHB RX 缓冲区只能容纳一个 32B 页面。因此,如果代码存储在 0x60002F60 和 0x60002F74 之间,则它不会跨越 32B 屏障,并且如果启用或禁用核心缓存,以及是否在 FlexSPI 中启用预取,循环将以相同的频率执行。如果代码存储在 0x60002F70 和 0x60002F84 之间,它将跨越边界,并且在禁用核心缓存时执行速度慢 6 倍,在禁用预取时速度慢 100 倍。启用预取时,
在 FlexSPI 寄存器中,AHBCR[READSZALIGN] 设置为 0,闪存在单独模式下访问。AHBRXBUF0-2 未配置,因此 AHBRXBUF3 的大小应等于 AHB RX 缓冲区总大小,根据 AN12437 为 128*64 位。它也应该用于所有读取访问,这似乎是因为在 AHBRXBUF3CR0 中禁用 PREFETCHEN 导致与在 AHBCR 中禁用 PREFETCHEN 相同的结果。MPU未激活。AHBRXBUF0-2 控制寄存器还提到了 AHBBUFREGIONiSTART 和 AHBBUFREGIONiEND,我在参考手册中找不到关于这些字段的任何信息。
按照 AN12437 中的建议激活核心缓存或将代码放入 ITCM 可以解决问题,但我想了解为什么会出现这种行为。

更多回帖

发帖
×
20
完善资料,
赚取积分