DSP 6678 多核CACHE一致性操作

1.CACHE一致性问题的产生

cache一致性问题一般发生在多核处理器上,单核处理器基本不用考虑这个问题。
现在的处理器一般都有两级甚至三级缓存。例如 TMS320C6678有L1cache,L2cache,还可以将4MB大小的MSM也设置为cache使用。
当核0读写外部存储器如DDR内的数据时,会将数据保存在L2cache和L1Dcache中。后续如果该数据一直在cache中,那么对该数据的读写都会直接操作cache内的数据,而不会去修改DDR中的数据。以此提高CPU的读写速度。但是这可能导致其他主机(如其他核)读取DDR的数据与核0中cache中的数据不一致。例如核0已经将位于DDR中的变量num从11修改为56了,但是其他核读取num时,依然有可能读取到的是11。最新的num数据56可能依旧在核0的cache中,没有写回到DDR中。
一般来说,多级缓存之间的一致性不需要我们来维护,我们主要维护不同核之间的数据一致。

2.CACHE提供的操作

参考sprugy8-TMS320C66x DSP Cache User Guide page 44页附近。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从上图可以看出,L1Dcache、L2cache都支持Invalidate、Writeback、Writeback– Invalidate等操作。

2.1 Invalidate

Invalidate和Invalidate ALL意思是将CACHE中的数据视为无效数据。可以指定需要无效数据的地址和大小,也可以无效CACHE中的所有数据。
当被无效的数据需要读写时,CPU会重新将目标数据读取到CACHE中操作,从而实现数据的更新。

2.2 Writeback

Writeback和Writeback ALL意思是将CACHE中的数据写回存储器中如DDR。可以指定需要写回数据的地址和大小,也可以写回CACHE中的所有数据。
注意,即使数据被Writeback了,CPU也不会无效CACHE中的数据。CPU后续对该数据的操作依然会在CACHE中进行,不会重新读取DDR中的数据。

2.3 Writeback– Invalidate

一旦执行此操作,会将CACHE中的数据写回DDR中,之后会将CACHE中的数据无效。可以指定需要操作数据的地址和大小,也可以一次操作CACHE中的所有数据。
上述CACHE操作都有官方的接口函数调用,也可以自己写一个,很简单的。

3. Prefetch Buffers

参考sprugw0c-TMS320C66x DSP CorePac User Guide page 148.
预取功能,如下图所示。DSP在读取数据,如从0x1000地址读取1024个字节后,会在结束地址0x1400额外向后读取128字节的数据,直到地址0x1480。在下次从0x1400地址起始读取1024字节时,从0x1400到0x1480之间的数据是上次预取的128字节旧数据。使用CACHE的Invalidate操作不能无效预取的数据。从而导致多核间数据不一致。
从文档可知有两种方法避免此问题:

  1. 共享数据的地址空间之间尽可能分开,估摸着128字节应该够了,防止预取到其他的数据。
  2. 操作XPFCMD寄存器,bit 0 写入1无效预取的数据。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    如下图所示,XPFCMD寄存器只写不可读。为确保写入成功,需要读取其他的XMC寄存器即可。
    在这里插入图片描述

5. CACHE操作的注意事项

当上述操作无误多核cache一致性依旧有问题时。
参考TMS320C6678 Multicore Fixed and Floating-Point Digital Signal Processor Silicon Revision 1.0, 2.0 的page 16、35的Advisory 7、22、27.
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

由上图Advisory 7、22可得,操作CACHE需要关闭中断、操作完毕后需要执行16 NOP(空循环)后恢复中断。

在这里插入图片描述
由上图Advisory 27可知,使用MFENCE时最好连用两个,只使用一个可能会出错。

4. Memory Attribute Registers (MARn)

参考sprugw0c-TMS320C66x DSP CorePac User Guide page 96。
解决CACHE一致性还有一个办法,6678拥有0-255共256个MAR寄存器,每个寄存器对应 0x100 0000个字节,通过配置MAR寄存器,可以使MAR对应的地址空间读取不使用CACHE缓存。相应的,CPU读写速度也会下降。数据所在地址不可CACHE,自然多核之间不存在数据不一致的情况了。
官方函数为CACHE_enableCaching(Uint8 mar),也可以自己实现,bit 0 写入0即可关闭缓存,比较简单。
每个MAR寄存器对应的地址范围参考官方文档,篇幅有限无法放下。
在这里插入图片描述
在这里插入图片描述

  • 16
    点赞
  • 137
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值