1. 初识DSP 6678的Cache:不只是“开关”那么简单
很多刚开始接触TI TMS320C6678这款多核DSP的朋友,一听到“开Cache”,第一反应可能就是:这不就是调用一个库函数,把开关打开就完事了吗?我刚开始也是这么想的,结果在实际项目里踩了不少坑。今天我就以一个过来人的身份,跟你聊聊在6678上配置和优化Cache的那些事儿,这绝对不是一个简单的开关,而是一套关乎你整个系统性能和数据正确性的“组合拳”。
简单来说,Cache就像是DSP核心和外部慢速存储器(比如DDR)之间的一个高速“中转仓库”。6678每个核都有自己的私人小仓库(L1P和L1D,各32KB),还有一个稍大点的私人仓库(本地L2,512KB)。除此之外,八个核还共享一个超大的公共仓库(共享L2,也叫MSM SRAM,4MB)。你的程序和数据,会先从慢吞吞的DDR搬到这些高速仓库里,CPU直接跟仓库打交道,速度自然就上去了。但问题也随之而来:当八个核都在这个复杂的仓库体系里存取东西时,怎么保证A核刚放进仓库的新数据,B核能立刻拿到,而不是拿到一个旧版本?这就是我们后面要重点解决的多核一致性问题。
所以,“开Cache”这个说法其实有点笼统。它至少包含三层意思:第一,你得告诉硬件,哪些地址空间允许使用Cache(配置仓库的准入规则);第二,你得根据程序特性,设置好每个仓库的大小和工作模式(是纯当高速SRAM用,还是当Cache用);第三,也是最重要最棘手的,你得设计一套机制,确保八个核看到的共享数据永远是最新的,不能出现数据错乱。如果你只做了第一步,那系统跑起来大概率会出一些灵异问题,比如某个核算出的结果莫名其妙不对,或者程序偶尔跑飞,调试起来能让人抓狂。接下来,我就带你从最基础的配置开始,一步步深入到多核一致性的实战优化。
2. 基础配置:让Cache为你所用
在动手写代码之前,我们得先摸清家里的“仓库布局”。6678的Cache配置非常灵活,尤其是L2部分。你可以通过修改一些底层的配置寄存器(比如L1PCFG, L1DCFG, L2CFG)来调整它们。这里有个关键选择:Cache模式还是SRAM模式? 听起来有点绕,我打个比方。Cache模式就像个智能仓库管理员,他会自动猜测你接下来需要什么货,提前从DDR(大库房)搬进来,用不到的货也可能被自动替换出去。而SRAM模式呢,这个仓库就变成了一块固定的、高速的存储区,你完全手动管理里面放什么,放进去就一直在那儿,不会被自动替换。
那么怎么选呢?我的经验是,对于L1P(程序缓存),绝大多数情况都用Cache模式,因为程序执行有很强的空间局部性和时间局部性,智能预取能极大提升效率。对于L1D(数据缓存),也推荐用Cache模式。但对于本地L2,情况就复杂了。如果你的算法有非常确定的、需要反复访问的核心数据块(比如图像处理中的一行像素,或滤波器系数),把这部分关键数据通过DMA搬到L2 SRAM里锁定住,性能收益是立竿见影的。你可以将L2的一部分划为SRAM,另一部分划为Cache。配置寄存器里通常有对应的位域来控制这个划分。
除了模式,另一个基础配置是内存属性寄存器(MAR)。这是控制Cache准入的“门卫”。DSP的整个寻址空间(比如DDR、片上共享


351

被折叠的 条评论
为什么被折叠?



