ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:77.46KB ,
资源ID:8459620      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8459620.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(有关C6000DSP的Cache的操作教学内容.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

有关C6000DSP的Cache的操作教学内容.docx

1、有关C6000DSP的Cache的操作教学内容有关C6000DSP的Cache的操作篇幅之一 TI C64x+ DSP CACHE 一致性分析与维护作者: DSP 技术应用工程师 陈永康摘要在各种数字信号处理系统中,CACHE被广泛用于弥补Core与存储器之间的速度差异。在CACHE的使用过程中,存在不同类型存储器之间数据是否一致的问题。本文着重分析TI高性能C64x+ DSP系列中各级CACHE之间数据一致性问题以及如何进行一致性维护。1. 概述CACHE作为Core和低速存储器之间的桥梁,基于代码和数据的时间和空间相关性,以块为单位由硬件控制器自动加载Core所需要的代码和数据。如果所有程

2、序和数据的存取都由Core完成,基于CACHE的运行机制,Core始终能够得到存储器中最新的数据。但是当有其它可以更改存储器内容的部件存在时,例如不需要Core干预的直接数据存取(DMA)引擎,就可能出现由于CACHE的存在而导致Core或者DMA不能够得到最新数据的现象,也就是CACHE一致性的问题。2. C64x+ 存储器组织结构TI对高性能C64x核进行了改进,使其性能大大提升,称之为C64x+DSP核。基于C64x+核开发的DSP芯片,所有部件都以交换网络(SCR)为核心连接起来。SCR上的部件分为两类:Master和Slave。Master包括Core、EDMA以及串行高速IO(sR

3、IO),EMAC等外设。Master可以直接通过SCR发起到Slave的数据传输。Slave包括每一个Core的内存,DDR2外存以及其它不能直接发起数据传输的外设,Slave之间的数据传输,需要通过DMA协助完成。各款基于C64x+DSP的数据手册上详细描述了SCR的配置和Master、Slave的情况。C64x+系统的存储器框图如图 1所示。存储器被分成了三级:第一级是L1,包含数据存储器(L1D)和代码存储器(L1P);第二级是代码和数据共用存储器(L2);第三级是外部存储器,主要是DDR2存储器。L1P、L1D和L2的CACHE功能分别由相应的L1P控制器、L1D控制器和L2控制器完成

4、。表 1总结了C64x+平台上可用的CACHE情况。图 1 C64x+存储器框图表 1 C64x+ CACHE特性类型大小Line 大小L1P代码;直接映射;最大32K 字节32 字节L1D数据;2路; 读分配最大32K 字节64 字节L2代码、数据;4路;读写分配最大256K 字节128 字节C64x+平台上L1P用来存储或者缓存代码;L1D用来存储或者缓存数据。L1P和L1D大小都是32K字节,可以分别配置0K、4KB、8KB、16KB或者32KB作为CACHE,其余作为代码或者数据RAM。作为CACHE的部分,用来缓存L2和DDR2的数据或代码。作为RAM的部分,可以存储关键的代码或者数

5、据使得Core能够以很高的速度C64x+平台上L2 存储器可用于存储代码和数据。L2上最大可以分配256K字节CACHE来缓存DDR2中的数据或代码。L2中其余部分作为RAM存储代码和数据。图 2描述了Core访问存储器内容的操作流程。在这个访问流程中,Core对于存储器的访问总是先从离Core最近的一级存储器开始,如果命中,Core可以直接得到代码/数据,否则代码/数据会被加载到前几级的CACHE中,从而Core可以得到要处理的代码/数据。在这个动态访问过程中,各级CACHE中的内容和下一级存储器中的内容可能存在不一致,这种瞬态的不一致不会造成问题。但是,如果Core或者其它Master不能

6、得到另外一方对存储器内容更新后的内容,就会出现CACHE一致性问题。图 2 Core访问存储器流程3. CACHE一致性问题分析在任何时刻,Core或者其它Master访问存储器中数据时,由于CACHE的存在造成不能够得到最近更新过的数据,就会出现CACHE一致性问题。在一个特定的时间范围内,各级CACHE和它的下一级存储器中的内容不一致是正常的。因为CACHE的作用是在一段时间内将低速存储器中的内容自动搬运到高速的CACHE中重复使用。当CACHE中的空间被后续的数据占用的时候,才将CACHE中的内容进行失效或者回写的操作。在失效或者回写之前,CACHE中的内容可能与物理存储器中的内容是不一

7、致的。这种临时性的不一致是正常的,上述CACHE一致性问题的描述不包含此类正常情况。CACHE的引入是为了提高Core存取数据的效率,所以出现CACHE一致性问题一定与Core对存储器的访问有关。Core对存储器的访问分为两类:1. Core读代码或者数据;2. Core写代码或者数据。据此,CACHE的一致性问题分为两个大类:Core读一致性问题和Core写一致性问题。在下面两个小节中,分别描述了这两种情况的模型:3.1 Core读一致性模型图 3给出了Core读一致性的模型。在这个模型中,CACHE一致性问题的存在取决于图中虚线箭头指示的第二步操作能否在Core从CACHE中重新读数据之前

8、完成。如果不能,则会造成Core读取的数据不是其它Master更新后的数据,而是原来CACHE中的内容,从而导致一致性的问题。图 3 Core读一致性模型L1P CACHE对L2内存或者DDR2外存中的代码进行缓存。当Core第一次对L2或者DDR2中的代码进行读操作的时候,由于代码不在L1P CACHE中,CAHCE硬件会将L2或者DDR2中的代码读到L1P CACHE中。Core可以得到最新的代码,不存在一致性的问题。此后,如果其它Master更新L2或者DDR2中的代码,然后Core再次读取此部分代码时,会发现相应的代码已经存在L1P CACHE中,此时Core会直接从L1P CACHE

9、中读取代码。由于Core不能得到最新的代码,就出现了Core读一致性的问题。L1D Core读一致性问题的原理和L1P相同,只是L1D缓存的是L2或者DDR2中的数据。L2 CACHE对DDR2中的代码/数据进行缓存,当Core第一次对DDR2中的代码/数据进行读操作,这时代码/数据不在L2 CACHE中,需要进行L2 CACHE的加载,Core可以得到最新的代码/数据。之后,其它Master对DDR2中的代码/数据进行更改,Core重读此部分代码/数据的时候,Core读到的是L2 CACHE中的内容而不是DDR2中最新的代码/数据,因此也存在Core读一致性的问题。3.2 Core写一致性模

10、型图 4给出了Core写一致性的模型。在这个模型中,CACHE一致性问题的存在取决于图中虚线箭头指示的第二步操作能否在其它Master从存储器中读数据之前完成。如果不能,会造成其它Master从存储器中读到的数据是原来的数据而不是Core更新过的数据,从而导致一致性的问题。图 4 Core写一致性模型当Core对L2或者DDR2中的代码/数据进行写操作的时候,如果代码/数据已经在L1 CACHE中,新的代码/数据会被更新到L1 CACHE中。当其它Master从L2或者DDR2中读代码/数据的时候,会直接从L2或者DDR2中读取相应的内容,如果L1 CACHE中新的代码/数据未被更新到L2或者

11、DDR2中,则其它Master读取的不是更新后的内容,就会出现Core写一致性的问题。同样,Core更新过的代码/数据有可能只是缓存在L2 CACHE中,其它Master从DDR2中读取的内容不是更新后的内容,同样会出现Core写一致性的问题。3.3 C64x+一致性分析在C64x+上的CACHE一致性问题,需要根据放置代码/数据的相应位置进行分析。由于在C64x+平台上,L1P、L1D和L2内存既可以作为CACHE又可以作为存储器使用,因此,在分析一致性问题的时候,需要考虑以下几种情况Case1. 代码在L1P存储器中;Case2. 代码在L2存储器中;Case3. 代码在DDR2存储器中;

12、Case4. 数据在L1D存储器中;Case5. 数据在L2存储器中;Case6. 数据在DDR2存储器中。对于Case1,由于代码直接在L1P存储器中,不需要进行CACHE,所以不会存在一致性的问题。对于Case2和Case3,涉及到L1P CACHE,存在代码的更新能否被Core读到的问题。代码的更新分成两种情况:一是Core在运行过程中对代码进行修改;二是其它Master对代码的修改。这两种情况下,都会存在CACHE读一致性问题,需要由软件来维护。对于Case4,数据直接在L1D存储器中, Core始终能够读到其它Master更新到L1D内存中的内容,Core写过的数据也能够被其它Mas

13、ter直接从L1D内存中读到。所以不会存在一致性的问题。对于Case5,数据在L2存储器,按照上面的分析,会存在CACHE读和写一致性的问题。在C64x+平台上这种情况下的一致性问题会由硬件自动维护。对于Case6,也会存在CACHE读和写一致性的问题,这种情况需要软件进行CACHE一致性的维护。4. C64x+ CACHE一致性维护操作出现CACHE一致性问题时,为了保证Core或者其它Master在进行数据操作的时候能够得到最新的数据,需要进行CACHE的一致性维护操作。CACHE一致性问题维护在设计中,有两种处理方式:硬件自动维护和应用程序进行维护。下面具体分析以上几种情况在C64x+平

14、台上如何进行CACHE一致性问题处理:4.1 硬件维护的CACHE一致性在C64x+平台上,硬件会对Case5的情况自动进行数据一致性维护。分析需要分为读写两类操作进行,图 5和图 6分别描述了Core对L2上的数据进行读和写的情况。图 5 Core读L2数据的情况图 6 Core写L2数据的情况其它Master要对L2中的内容进行更新操作时,L2控制器会根据被更新数据的地址判断相应的地址是否在L1D CACHE中,如果在L1D CACHE中,硬件会自动将更新的数据拷贝一份到L1D CACHE中。当Core重新对L2中的这部分数据进行处理的时候,如果要读取的数据已经在L1D CACHE中,Co

15、re可以直接从L1D CACHE中得到更新过的数据。如果要读取的数据不在L1D CACHE中,L1D控制器会自动从L2加载数据,Core也可以得到更新后的数据。过程如图 5中的1和2所示,这样就可以解决一致性的问题。其它Master要对L2中的内容进行读操作的时候,L2控制器会判断要读取的数据地址是否在L1D CACHE中,对于在L1D CACHE中的数据,硬件会自动从L1D CACHE中读取最新的数据。对于不在L1D CACHE中的数据,说明L2中的数据已经是最新的数据,可以直接从L2中读取。通过这样的处理,可以保证其它Master读到Core更新后的数据,从而可以解决一致性的问题。过程如图

16、 6中的1和2所示。4.2 软件维护的CACHE一致性在C64x+平台上,Case2、Case3和Case6的情况需要软件进行的一致性维护操作以保证Core或者其它Master可以得到最新的数据。4.2.1 C64x+软件一致性维护实现C64x+平台上由软件控制的一致性维护操作包含三种:CACHE数据失效、CACHE数据回写和CACHE数据回写并失效。启动维护操作需要配置相应的基地址和计数寄存器,当计数寄存器中的值变为0时表示操作完成。TI提供的芯片支持库中也提供了相应的API来完成相应的功能。各种操作涉及的各级CACHE的一致性操作控制寄存器列在表 2中。 WB:全局回写寄存器 INV:全局

17、失效寄存器 WBINV:全局回写并失效寄存器 IBAR: 部分失效基地址寄存器 IWC:部分失效计数寄存器 WBAR:部分回写基地址寄存器 WWC:部分回写计数寄存器 WIBAR:部分回写并失效基地址寄存器 WIWC:部分回写并失效计数寄存器 表 2 C64x+ CACHE一致性维护寄存器类型L1P CACHEL1D CACHEL2 CACHE全局失效L1PINVL1DINVL2INV全局回写不支持L1DWBL2WB全局回写并失效不支持L1DWBINVL2WBINV部分失效LIPIBARL1PIWCL1DIBARL1DIWCL2IBARL2IWC部分回写不支持L1DWBARL1DWWCL2WB

18、ARL2WWC部分回写并失效不支持L1DWIBARL1DWIWCL2WIBARL2WIWC例如,需要对L2 CACHE进行部分回写操作,需要将回写的DDR2的地址配置到L2WBAR,同时将需要回写的数据32-bit长度写到L2的计数寄存器L2WWC中,当L2WWC中的值变为0之后,表示回写操作已经完成。4.2.2 代码CACHE一致性图 7中描述了其它Master对L2中代码进行修改的情况。这种情况下,当Core第一次执行此部分代码时,这部分代码会被加载到L1P中。之后如果被其它Master修改,Core仍会从L1P中读取原来的代码而不是更新后的代码。因此需要软件进行图中2指示的操作。软件不需

19、要进行代码的搬移,只要在Core重新执行此部分代码之前将L1P中此部分内容失效。当Core再次执行此部分代码的时候,会按照CACHE的正常机制进行此部分代码的重新加载,从而保证Core可以读取到更新后的代码。操作顺序如下:1. 其它Master对L2中的代码进行更新 2. Core在执行此段代码之前对L1P中的此段地址进行失效操作 图 8描述的是其它Master对DDR2中代码进行修改的情况。这种情况下,需要在Core重新执行此部分代码前,将L1P和L2 CACHE中的相应内容进行失效以保证Core执行时可以将最新的代码加载到L2和L1P CACHE中。操作顺序如下1. 其它Master对DD

20、R2中的代码进行更新 2. Core在执行此段代码之前对L2中的此段地址进行失效操作 3. Core在执行此段代码之前对L1P中的此段地址进行失效操作 图 7 其它Master修改L2代码的情况图 8 其它Master修改DDR2代码的情况Core对修改代码会转换为对存储器的写操作,由于L1P只对读不命中的情况才分配CACHE,所操作的代码一定不在L1P CACHE中,更新的代码会被直接写到L2中,如果修改的是DDR2中的代码,数据可能会被更新到L2 CACHE中。之后的所有操作与上述两种情况的处理相同。4.2.3 数据CACHE一致性对于数据部分的一致性维护,需要由软件维护的情况是Case6

21、。包括Core对DDR2的读取和写两种情况。图 9和图 10分别描述了这两种情况。图 9描述的是Core读取DDR2中数据进行处理的情况。当其它Master对此部分数据进行更新之后,在Core重新读取之前,为了保证DDR2中的数据会被重新加载到L1D和L2中,需要将L1D和L2 CACHE中与此部分数据对应的内容失效。操作顺序如下:1. 其它Master对DDR2中的数据进行更新 2. Core在读此段数据之前对L2中的此段地址进行失效操作 图 9 Core对DDR2上的数据读的情况图 10描述了Core对DDR2中数据更新的情况,更新的数据可能被保存在L1D 或者L2 CACHE中。为了保证

22、其它Master能正确读取此部分数据,需要将L1D或者L2 CACHE中更新的此部分数据回写到DDR2。操作顺序如下:1. 将L1D CACHE中的此部分数据进行回写 2. 将L2 CACHE中的此部分数据进行回写 3. 其它Master可以从DDR2中读到更新后的数据 图 10 Core对DDR2上的数据写的情况结论CACHE一致性问题是DSP应用中常见的问题,TI C64x+ DSP是业界高性能信号处理平台,具有优良的CACHE性能。C64x+平台CACHE一致性问题的维护操作情况总结如下:表 3 C64x+平台CACHE一致性问题的维护操作类型是否存在CACHE一致性问题硬件/软件维护代

23、码在L1P存储器中否不需要代码在L2存储器中是软件代码在DDR2存储器中是软件数据在L1D存储器中否不需要数据在L2存储器中是硬件数据在DDR2存储器中是软件C64x+平台上CACHE一致性问题维护可以归纳为以下两点:1. 代码部分的一致性问题需要由软件来维护;2. 只有当Core和其它Master共同需要访问的数据缓冲区在外部存储器中的时候,数据CACHE一致性问 题才需要由软件来进行维护。其它情况下,数据CACHE一致性都会由硬件自动完成。篇幅之二 dsp cache优化以前我自己编写过乒乓结构的程序,后来查资料的时候发现乒乓结构还是很普遍的用法,但是我是初学者,其实编程优化方面,只是做过

24、手工的软件流水,对于硬件的深入了解还远远不够,对CACHE的程序级优化还有待提高,下面是今天学习的一些摘录,我相信对我今后一定有很大用处对于一般的CPU信号处理加上外围设备的DMA数据读写情况,处理方法是在内存中开辟pingpong缓冲区。inbufa,outbufa,inbufb,outbufb四块内存区,当CPU处理inbufa的数据并将产生的结果放到outbufa,这是外围器件DMA搬移数据到inbufb,另一外围设备将数据从outbufb搬出;同理当CPU处理inbufb并将产生的结果放到outbufb时,外围设备利用DMA分别从inbufa和outbufa搬入数据和搬出数据。 一般L

25、2RAM(内存) DMA实现代码如下:for (i=0; i OutBuffA Processing */* */ / 外围器件DMA搬移数据到InBuffB/另一外围设备DMA将数据从InBuffB搬出process(InBuffA, OutBuffA, BUFSIZE); /CPU处理InBuffA的数据并将产生的结果放到OutBuffA/* */* InBuffB OutBuffB Processing */ /解释同上/* */process(InBuffB, OutBuffB, BUFSIZE); 上面(内存)CACHE的一致性由CPU自动管理,无须程序员设置,而下面要说的片外RAM

26、开辟双缓冲区时要求程序员掌握L2cache 和片外RAM coherence(一致性)以及L2RAM和L1D的一致性,否则程序会出错。对于C64x系列,无论什么时候当片外设备DMA写片外RAM开辟的inbuf时,都要使用CACHE_invL2(InBuffB, BUFSIZE, CACHE_WAIT),使L1D当中的inbuffb无效;当片外设备DMA读片外RAM开辟的outbuf时,都要使用CACHE_wbL2(OutBuffB, BUFSIZE, CACHE_WAIT),使L1D当中的相应数据write back 到片外RAM .External Memory DMA Double Buf

27、fering Code Examplefor (i=0; i OutBuffA Processing */* */CACHE_wbInvL2(InBuffB, BUFSIZE, CACHE_WAIT); / 使L1D当中的InBuffB无效 / 外围器件DMA搬移数据到InBuffBCACHE_wbL2(OutBuffB, BUFSIZE, CACHE_WAIT); / 使L1D当中的相应数据write back 到片外RAM /另一外围设备DMA将数据从InBuffB搬出process(InBuffA, OutBuffA, BUFSIZE); /CPU处理InBuffA的数据并将产生的结果放

28、到OutBuffA/* */* InBuffB OutBuffB Processing */ /解释同上/* */CACHE_wbInvL2(InBuffA, BUFSIZE, CACHE_WAIT);CACHE_wbL2(OutBuffA, BUFSIZE, CACHE_WAIT);process(InBuffB, OutBuffB, BUFSIZE); 虽然我们可以指定一定大小的buf被write back或者invalidate或者write back+invalidate,但是cache controller是对完整的line操作,这就要求我们在片外RAM开辟内存( 或者数组)作buffer时,尽量使得其大小是CACHE_L2_LINESIZE(128)的整数倍并且CACHE_L2_LINESIZE对齐,为此我们需要:#pragma DATA_ALIGN(InBuffA, CACHE_L2_LINESIZE)/使InBuffA按CACHE_L2_LINESIZE内存对齐#pragma DATA_ALIGN(InBuffB, CACHE_L2_LI

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1