打印

嵌入式系统中的CACHE问题(转帖)

[复制链接]
2742|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
high|  楼主 | 2009-5-14 01:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

摘要:描述了在实时嵌入式系统开发中遇到的与CACHE有关的问题。对引起这些问题的原因——CACHE和RAM的不一致性进行了讨论。最后,提出了解决问题的方法。
   关键词:嵌入式实时系统 CACHE 不一致性
随着社会的发展、人们生活水平的提高,人们对嵌入式计算机应用的要求也越来越高。因此,对嵌入式系统的性能要求也越来越高。明显体现在嵌入式系统的CPU速度的不断提高上。但问题也随之而来,嵌入式CPU的主频不断地提高,一方面加强了CPU的处理能力,另一方面,在速度上造成了与慢速的系统存储器极不相配的情况,从而影响了整个系统的性能。
为了解决这个问题,引入了CACHE技术。CACHE是一种高速缓冲存储器,是为了解决CPU和主存之间速度不匹配而采用的一项重要技术。通过在主存和高速CPU之间设置一个小容量的高速存储器,在其中存放CPU常用的指令和数据,CPU对存储器的访问主要体现在对SRAM的存取,CPU可以不必加等待状态而保持高速操作。
采用CACHE技术,解决了CPU与主存之间速度不匹配的问题;但它又带来了一些其它问题,如本文将提到的一致性问题。
1 问题的发现与原因
在进行某嵌入式系统项目的开发过程中,有一个环节需要使用DMA方式进行数据传输。当程序运行后,发现传到目的地的数据块中经常会有一些错误的字节。如:数据本应为00 01 02 03 04 05 06 07 08 09 0A 0B ...(16进制),结果却是00 01 02 0300 00 00 00 08 09 0A 0B...。在某些环节也出现了类似的问题。例如,通过HDLC通道向外发送数据,发送的总是缓冲区初始化时的内容,实际要发送的数据总是发不出去,但使用调试工具看内存中的数据,却是正确的。
经过一段时间的调试,发现出现这种现象的环节都使用了DMA传输数据。在通过HDLC通道发送数据的例子中,HDLC通道内部也是用DMA方式从内存直接读数据并向外发送。经过分析,认为问题的原因是出在CACHE上,是由于CACHE数据与内存数据的不一致性造成的。
所谓CACHE数据与内存数据的不一致性,是指:在采用CACHE的系统中,同样一个数据可能既存在于CACHE中,也存在于主存中,数据一样则具有一致性,数据若不一样就叫做不一致性。具体表现在两个方面:
(1)更新时可能CACHE中的数据更新,而主存未更新,则造成数据丢失;
(2)在有DMA控制器的系统和多处理器系统中,有多个部件可以访问主存。这时,可能其中有些部件是直接访问主存,也可能每个DMA部件和处理器配置一个CACHE。这样,主存的一个区块可能对应于多个CACHE中的一个区块。于是会产生主存中的数据被某个总线部件更新过,而某个CACHE中的内容未更新,造成数据过时。

2 问题的分析
要解释这个问题,首先要了解CACHE的工作模式。CACHE的基本工作模式有两种:write-through模式和copyback模式。在write-through模式下,所有的写操作都写入CACHE和RAM,保证了CACHE和RAM的一致。然而,每次对RAM都有写操作会使处理器的处理能力降低,并且占用总线带宽。在copyback模式下,写操作只写入CACHE,不写入RAM,从而提高了处理器性能和总线带宽。copyback模式下,CACHE中的内容只有在需要的时候才写到RAM中。当CACHE中无可用空间时,一般使用最近最少使用算法(LRU)来决定哪一个CACHE项被替换。copyback模式提供了很高的系统性能,但是需要更多的一致性作保证。为了便于理解,给出一个使用了CACHE的系统的逻辑框图,如图1所示。
该系统中两个地方会发生CACHE的不一致性:
(1)数据CACHE / RAM
数据CACHE与RAM之间的问题源于处理器和其他总线控制器对RAM的异步读写访问。DMA设备和其他总线控制器对RAM的访问是引起CACHE一致性问题的主要原因,这个问题可以通过在程序中加入一些代码来解决。
(2)共享CACHE LINE
当一个CACHE LINE被两个以上的线程共享时,也会产生一致性问题。当某个线程使一个CACHE LINE无效时,这个CACHELINE中的一些项可能属于另外一个线程。这个问题也可以通过一定的方法来避免,只要在分配内存时大小是CACHE LINE大小的整数倍即可。
在哈佛体系结构、copyback模式和无软件干预的前提下,最佳的保持一致性的方法就是使用具有总线监听能力的硬件。将CACHE、RAM、DMA设备和其它所有的总线主控设备都连到一个物理总线上,以使CACHE可以对该总线上的总线交互过程进行监听,CACHE将对总线上的地址周期和控制(读/写)比特监听,数据周期则被延迟到需要时才进行。当CACHE中的一项被一个异步操作修改时,该CACHE项就会被标为无效。如果处理器对一个已经被标为无效的CACHE项进行访问时,CACHE就会从RAM中重新载入有效数据。在copyback模式下,处理器对CACHE进行写操作时,RAM相应地址中的内容就变成过时。如果另外一个设备想访问RAM中的这部分内容,CACHE就会抢占该访问周期,将有效的数据写入RAM。然后被抢占的访问周期重新开始并将读到RAM中的有效数据。但是,目前提供监听能力的板子并不多。
3 解决的方法
根据上面的分析和讨论,可见问题正是由数据CACHE /RAM的不一致性引起的。虽然关掉CACHE就可以解决一致性的问题,并且能够减小程序开发的复杂度。但是一个高性能的系统是需要CACHE的,关掉CACHE会大大降低系统的性能。因此,本文仅讨论在程序中加入代码来克服一致性问题的方法。
可以采用以下几种加入代码的方法来解决一致性的问题

相关帖子

沙发
high|  楼主 | 2009-5-14 01:40 | 只看该作者

疑问?

对同一物理地址设置2个虚拟地址,如同wince这样是否就避免了dma和cache的异步问题?

虚拟地址8000 0000  对应物理3000 0000, 但是通过cache访问
虚拟地址A000 0000 也对应物理3000 0000, 但是绕过cache访问

可能对‘上层’麻烦, 但是弄dma的‘上层’应该是驱动层,不怕这个麻烦,
这是不是最省事的方案? 

使用特权

评论回复
板凳
chadwickbi| | 2009-5-15 15:55 | 只看该作者

如楼上:唯一省事的方案就是DMA访问的空间禁用Cache

唯一省事的方案就是DMA访问的空间禁用Cache,倒和虚拟地址没多大关系。但是如楼主所述会带来性能上的损失。
所以省事的方案不是好方案。

使用特权

评论回复
地板
high|  楼主 | 2009-5-15 17:42 | 只看该作者

白写了. 21ic不稳定?

楼上可能没有理解我的意思.

并不是禁用cache, 1不是全局禁用,2不是dma空间禁用.

只是dma空间其实有2个路径2个地址来访问,1路是经过cache,另外1路是绕过cache的. 比如设备驱动程序, 都是要绕过cache的.

使用特权

评论回复
5
温sir| | 2015-12-9 15:21 | 只看该作者
mark cache

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

99

主题

1078

帖子

0

粉丝