DSP6678 cache理解与维护心得

DSP6678的开发过程中,cache是一个不能避开的技术点,笔者根据自己的项目经验和理解,对cache做一个粗浅的总结和梳理,是对自己知识的复盘,希望能带给读者一些帮助。参考c6678 cache user’s guide

一 、为什么使用Cache

从DSP的应用角度来讲,大量的快速的片上内存是很理想的,但从这些年的发展看,处理器性能的提高远快于内存技术的提高,这样就存在处理器核心速度和内存速度之间的差异,为了尽可能的消除这一硬件壁垒,就出现的cache技术。从下图可看出6678的内存和速率的变化,越靠近CPU的内存速率越高,离CPU越远速率越慢。
在这里插入图片描述

二、什么是Cache

6678的cache架构 6678的内存架构包含两级cache缓存:

  1. 第一级缓冲区根据功能分为L1P/L1D ,各有32kB大小,L1P负责缓冲指令,L1D负责缓冲数据,他们也都可被配置成SRAM,供用户使用;
  2. 第二级缓冲区叫L2,大小512KB,也都可被配置成SRAM或cache;
    注意:上电默认L1D/L1P均被配置成cache,L2被配置成SRAM
    在这里插入图片描述
    对于6678来说,L1D的cache基于读分配来执行的,即如果这段内存是被cache到的,读这段内存时,会触发cache分配,从物理地址读数据,同时拷贝一份到L1D中,之后,如果重复对这段物理地址读写,只会对cache进行操作,从而完成对内存存取的加速过程。如果cache空间已满,硬件会自动将老都数据驱逐到物理内存上,同时销毁cache与这段内存的映射,并将新数据放入cache。如果操作的地址未被cache到,则这段内存的写操作不会引发cache.
    注意:L3有4MB空间,为共享内存空间,默认情况是开cache的

三、怎么使用Cache

  1. 对于L3的地址读写,因为其默认开cache,所以需要用户手动维护cache,L2也默认开cache,但上有SNOOP协议,会有单独的硬件检测L2地址的读写,并及时更新cache,不需要用户进行cache维护。

  2. TI官方提供了维护cache的函数CSL_CACHEAUX.H,其中有 cache_wb( 写回),cache _inv(失效) cache_wbinv(写回并失效),有全局写回失效的函数,也有局部写回失效的函数,注意:cache所有有关的操作,操作粒度为64字节,起始地址均须64Byte对齐.

  3. 6678的cache不一致问题
    情况举例:
    (1)8个核分段在(0x0c000000)L3上计算了一个4096点的序列,每个核计算512个点,计算完成的数据需要核0 做下一步计算,可以想象一下内存是怎么执行的,核0会从自己的cacheL1D空间读取一个4096长度的数据,此时,其他核中计算完的正确数据在自己的L1D cache空间中,这就导致核0读取的其他核的数据是错误的。解决方法:在核0开始计算之前需要将所有核中cache上的数据写回物理地址,并且销毁cache映射。才能保证核0读到的是共享内存L3物理地址上的所有核写会的正确的数。
    (2)核0 读取 L3(0xc000000)上的字,这段内存,读取的同时,被刷到L1D中,假设读取到的数据为0x5A,此时L1D对应数据也是0x5A,此时,EDMA外设对这段地址写入0x6B,物理地址上的数据被更新成0x6B,核0 重复对这段地址进行读取,CPU没有检测到地址被更改,还在L1Dcache中读取内容,数据依然为0x5A ,错误发生;解决方法:由于这一段地址随时有可能被外设更新,每次核0读之前,需要手动失效这段空间的cache。

  4. 6678的cache维护准则
    cache维护小技巧:
    (1)对共享内存进行读写操作时,主动考虑是否有cache风险;
    (2)读数据之前,对这段地址进行cache失效;
    (3)写数据之后,对这段地址进行cache写回;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值