TCM为紧密耦合内存。特点是与Core运行同频,访问速度快,可以实现0等待访问;而SRAM至少需要等待1 cycle(不同频),Flash就更慢了。缺点是部分DMA没办法访问。
Cache为L1层缓存,访问 sub 0-cycle(比0等待更快),实测会RAM+CACHE比使用DTCM快一丢丢。
最佳配置是RA+WBWA,读分配+写回分配。
简单展开讲讲WB跟WT(直写)的区别。
WB是cpu仅与cache交换数据,cache中数据暂时不同步到sram中;等合适时机(比如操作外设)是再写入sram中。假设对同一变量多次操作,这样可以避免来回在sram中写入数据的延迟(时间局限性)
WT是写的时候同时写cache和sram。效率更低,但没有一致性的问题。
一致性:
多Host情况下会产生cache一致性的问题。例如Core和DMA主机。具体有2种情况:
1,变量a同时位于sram和cache中,配置为WB模式。此时Core修改变量a的值,还未写入sram。若DMA搬运sram中a的地址,则会产生一致性的问题(SRAM数据比较老)。需要在搬运前CleanCache,同步sram;并在逻辑上结束前禁止修改变量a
2. 变量a同时位于sram和cache中,配置为WB模式。此时DMA从外设搬运一值到a,还未同步到cache。此时CPU访问变量a(从cache),会造成一致性的问题(cache数据较老)。需要在搬运后InvalidCache,抛弃现有cache数据,从sram中访问。
各位可以品一下区别。一般来讲,DMA搬出需要clean;搬入需要invalid。
更新:
这里不赘述设备ram、sram、mmio等mpu相关的知识。
除了上面2点,还需要考虑到2点:
1. 当cache满后,cache内的内容会随机回写到ram中。这个会破坏dma接收缓冲区
2. 当接收缓冲区附近的数据被cache时,有一定概率会加载cache缓冲区内的数据(尤其是访问uint8变量时,可能导致旁边的数据被一起cache) 空间局限性
故此,对于接收缓冲区:
需要在传递DMA之前就Invalid Cache;同时之后也需要Invalid Cache。
最简单的办法当然是dma区域禁止cache。