已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
嵌入式编程需注意的Cache机制东软飞利浦医疗设备系统有限责任公司 林先贤摘要介绍CPU的Cache机制的重要作用,以及Cache机制对于外设访问需要注意的地方。以ARM的几款CPU为例说明在嵌入式软件编程如何充分利用Cache带来的好处并妥善处理外设访问的问题。关键词 Cache,S3C4510,外设访问,内存Cache mechanism in embedded program Abstract The cache mechanism of CPU plays an important role for memory access, and cache mechanism for peripheral access needs attention. ARM CPU as an example to illustrate several embedded software programming to take full advantage of the benefits of Cache and properly handle the peripheral access issues.Keywords Cache, S3C4510, peripherals, memoryCache原理Cache即高速缓存,它的出现是基于两种因素:首先,是由于CPU的速度和性能提高很快而主存速度较低且价格高,第二就是程序执行的局部性特点。因此,才将速度比较快而容量有限的SRAM构成Cache,目的在于尽可能发挥CPU的高速度。我们知道CPU与外设交换数据时经常有用到缓冲,这与缓存极其相似,只不过cache(缓存)是为了提高cpu和内存之间的数据交换速度而设计,而buffer(缓冲)是为了提高内存和硬盘(或其他I/0设备)之间的数据交换的速度而设计的。以上知识摘自baidu知道。其实在利用baidu搜索的时候又接触一个缓存的例子,就是baidu快照。网址就是,可以想象它的作用与计算机CPU缓存有类似之处。Cache的原理构成如下图所示:CPUCache数据区Cache映射表MemoryCPU读内存数据时,将数据同时保存到Cache数据区,同时更新Cache映射表(保存地址信息,表示该地址的数据是否已在Cache数据区,即是否命中)。这样,CPU再次读该地址数据时,就可以直接从Cache提取。因为读Cache的时间远小于直接读内存,这样就提高了CPU读取数据的效率。Cache数据区有成块读取的特性(Cache映射表保存的地址是块地址,节省空间,另外也符合程序执行的局部性特点)。Cache数据区远远小于内存空间,这样Cache数据就有相应的替代算法。比如用最近最少使用算法,将新数据替代使用频率低的数据,同时更新映射表信息。我们可以推想到,Cache空间越大,命中率越高。以上是CPU读内存使用Cache的情况,写内存就需要直接更新Memory,如果映射表存在该地址信息,就需要同时更新Cache数据区。这种Cache访问方式就称作“直写”,S3C4510(samsung公司的ARM7 CPU)就是这种方式。还有一种Cache访问方式为“直读”,这里就不多说了。以下所讨论的Cache问题非特指情况下都是“直写”方式。访问外设使用Cache的问题按以上分析,在访问内存的时候使用Cache是不会出现问题的。如果访问数据易变外设(数据不依赖于CPU写操作而改变)使用Cache就可能出现问题,问题在于外设的数据改变不仅仅依靠CPU写操作,这样在CPU第一次读外设数据时将外设的数据和地址信息报存到Cache,第二次读外设数据时就可能有问题出现,因为数据直接从Cache提取,而外设的数据可能有改变。因此需要注意,在访问易变外设时,需要不使能Cache。应该直接读取外设数据到CPU,没有经过Cache的任何环节,即保证不改变Cache映射表和Cache数据区内容。S3C4510的SYSCFG SFR(特殊功能寄存器)有用来控制Cache使能或不使能的,通过对该SFR的设置可暂时禁止Cache或重新恢复Cache功能。这样就可以在读取外设前禁止Cache,读取结束后重新使能Cache,保证了外设数据读取的正确性;写数据到外设更没有问题,因为是“直写”方式。开关Cache引发的新问题不仔细分析感觉以上分析没有问题,是的,外设的数据读取的确没有问题。但是在Cache关开期间,如果有另一个进程/任务访问内存,如果它在此期间写内存并且该内存在Cache中已有映射,注意它也是被禁止Cache的,所以它不会同时更新Cache数据区的内容,这样在Cache重新使能之后,Cache数据区的信息已经过时了,但是Cache映射表还是Cache禁止之前的状态,如果CPU读数据就得到过时的数据。这样看来,引发的问题范围更广了,因为连内存的数据读写正确性都无法保证。与内存泄漏的影响来比较,内存泄漏如果是一颗定时炸弹,因为它所需要长时间运行程序得到爆发;Cache问题就可以说是随时随地都可能踩上的雷区,因为程序开始就可能引发。如上图是Cache使能的时候Cache映射表和Cache数据区保存了内存的数据信息,这是CPU访问内存是通过绿色的箭头通路实现的。内存的信息可以与Cache的信息保持一致。禁止Cache,情况有所变化。如上图所示,这时只能由黄色通道进行内存访问。即使改变了地址0x00处的数据55为AA,Cache区的信息仍为之前的状态。很明显,Cache的数据是应该废弃的,但是Cache映射表仍保存0x00的地址信息。这样如果Cache重新使能后,CPU再次读取0x00地址的数据,Cache仍是命中,直接从Cache数据区提取数据,这样读出来的数据就是0x55了。引用S3C4510数据手册(421)的原话:Cache Disable/EnableTo enable or disable the cache, you set the cache enable (CE) bit of the SYSCFG register to 1 or 0, respectively Because cache memory does not have an auto-flush feature, you must be careful to verify the coherency of data whenever you re-enable the cache. You must also carefully check any changes that the DMA controller may make to data stored in memory.为了证实以上的说法,写了以下这段测试程序循环执行void testCache(void)#define CACHE_ENABLE VPint(SYSCFG)=0xe7ffff86#define CACHE_DISABLE VPint(SYSCFG)=0xe7ffff84 volatile unsigned int data,*pData; volatile unsigned int dataSave1,dataSave2,dataSave3; pData = &data; CACHE_ENABLE; data = 0x55; dataSave1 = data; CACHE_DISABLE; data = 0xaa; dataSave2 = data; CACHE_ENABLE; dataSave3 = data; printf(ndata:%#x %#x %#xn,dataSave1,dataSave2,dataSave3); 结果如下:(如果没有CACHE影响,结果应该是55 aa aa,可见在cache关闭再打开的确可造成cache数据过时 ) data:55 aa 55data:55 aa 55data:55 aa 55data:55 0 55data:55 0 55data:55 aa 55data:55 aa 55data:55 aa 55data:55 aa 55data:55 0 55data:55 0 55data:55 aa 55其他CPU解决方案思考通过其他使用过的CPU进一步思考,Atmel的at91rm9200和Sumsung的S3C44B0,这两种CPU先后移植过操作系统,也对外设访问,而且整个过程中Cache都是使能的。它们的解决方案是什么呢?At91rm9200是ARM9系列带有MMU的CPU,MMU对内存有分页管理功能,可以实现多个进程的内存空间保护,Cache也是通过MMU管理的,这也是Cache和MMU经常同时存在的原因。S3C44B0和S3C4510同样都是Sumsung公司产品,并且都不带MMU,但是S3C44B0与S3C4510不同的是它有SFR可以配置非缓存范围,即使Cache使能,所设置范围的地址空间访问也不通过Cache实现。这样,可以很方便地实现内存是缓存区,其他外设是非缓存区。这两种方案对于S3C4510都无法实现。网络上有人解答用volatile关键字解决外设访问问题。可以这么想这个问题volatile关键字是在源代码中给编译器看的,它可能影响编译器的编译结果,但是最终CPU执行都体现到汇编语句,如果汇编语句都不能解决Cache问题,volatile语句也是不可能解决的。确实对于易变数据的外设使用volatile关键字是应该的,它避免编译器的优化,比如以下语句:UINT32 Value1,Value2;Value1 = *(volatile UINT32*)portAdd;Value2 Value1;While(Value1 = Value2)Value2 = *(volatile UINT32*)portAdd;在两次读取portAdd地址数据相同时等待,可以用到等待信号跳变的程序。如果将volatile关键字去除,有可能经编译器优化,Value2不会从实际的portAdd地址读取数据,而是利用Value1读取语句的中间寄存器直接获得。解决方案还是从S3C4510手册上(54)找到答案。见以下手册原话:CACHE FLUSH OPERATIONTo flush cache lines, you must write a zero to Tag memory bits 31 and 30, respectively.The 4-Kbyte set 0 RAM area, 4-Kbyte set 1 RAM area, and the 1-Kbyte Tag RAM area (total 256 words) can be accessed from locations 0x10000000H, 0x10800000H, and 0x11000000H, respectively. You can do this independently of the current cache mode bit and cache enable bit settings.Tag RAM is normally cleared by hardware following a power-on reset. However, if you change the cache or memory bank configuration when the cache is being enabled, you will have to clear the Tag RAM area using application software.NON-CACHEABLE AREA CONTROL BITAlthough the cache affects the entire system memory, it is sometimes necessary to define non-cacheable areas when the consistency of data stored in memory and the cache must be ensured. To support this, the S3C4510B provides a non-cacheable area control bit in the address field, ADDR26. If ADDR26 in the ROM/SRAM, flash memory, DRAM, or external I/O banks access address is 0, then the accessed data is cacheable. If the ADDR26 value is 1, the accessed data is non-cacheable.由上可以得到两种解决方案:一、Cache映射表手动更新既然Cache内容在关、开Cache之后过时,并且CPU不会自动刷新,我们可以通过手动更新的办法来抛弃废旧信息。就是将Tag RAM区(也就是前面所说的Cache映射表)清除(Flush cache),这样所有的Cache数据区内容都不能,直到再次读取数据时,同时更新Cache映射表和Cache数据区内容,才能使用。Flush cache操作将Tag RAM的1Kbyte内容清零,需要消耗一定时间,并且这样操作后Cache是0命中率的,需要一定访问次数后Cache信息重新填满,才能恢复正常的命中率。因此频繁地关、开C
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 彩礼不退怎么写在协议书
- ups巡检维护协议书
- 2025年RCEP项下玩具行业原产地规则应用考核试卷
- 牙科矫正退费协议书
- 疫情期捐赠协议书
- 人工施工安全协议书
- 装修款补充协议书
- 城市更新与城市夜景照明规划设计考核试卷
- 2025年航空港口行业智能物流枢纽建设与航空港口物流业务拓展研究报告及未来发展趋势预测
- 2025年互联网与信息技术岗位晋升考试数字人交互设计与应用跨域融合考核试卷
- 下肢血管超声检查技术规范
- 外派美国员工管理办法
- 2025全球智能体发展进展、面临挑战与对策建议报告-赛迪智库
- 2026高考物理大一轮复习-第三章 阶段复习(一) 力与直线运动-专项训练【含答案】
- 船舶修理质量通病防治措施
- 2025-2030中国金融租赁行业经营动态及前景趋势预测报告
- 肿瘤免疫治疗不良反应护理规范
- 大学入团考试试题及答案山东
- 建筑公司销售管理制度
- 牧原企业文化培训考试题及答案
- 幼儿园大班科学《动物的防身绝招》课件
评论
0/150
提交评论