微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > MCU和DSP > Cache在嵌入式处理器中的使用问题

Cache在嵌入式处理器中的使用问题

时间:07-18 来源:中国测控网 点击:

随着嵌入式计算机应用的发展,嵌入式CPU的主频不断提高,这就造成了慢速系统存储器不能匹配高速CPU处理能力的情况。为了解决这个问题,许多高性能的嵌入式处理器内部集成了高速缓存Cache。其中,三星公司的S3C44B0X内部就集成了8 KB空间统一的指令和数据Cache。

Cache即高速缓冲存储器,是位于CPU与主存之间一种容量较小,但速度很高的存储器。由于CPU在进行运算时,所需的指令和数据都是从主存中提取的,而CPU运算速度要比主存读写速度快得多,这样极其影响整个系统的性能。采用Cache技术,即在Cache中存放CPU常用的指令和数据,然后将这些数据和指令以一定的算法和策略从主存中调入,使CPU可以不必等待主存数据而保持高速操作。这样就满足了嵌入式系统实时、高效的要求。但Cache的使用也带来了一致性的问题,在应用中应特别注意。

1 Cache一致性问题的发现

本项目的目标板为:处理器采用ARM芯片S3C44B0X,存储器采用2片Flash和1片SDRAM,在调试的时候输入采用键盘,输出采用显示器,用RS232串口实现通信。

在项目的开发过程中,经软件仿真调试成功的程序,烧入目标板后,程序却发生异常中止。通过读存储器的内容发现,程序不能正常运行在目标板上,是因为存储器中写入的数据与程序编译生成的数据不一致,总是出现一些错误字节。

经过一段时间的调试发现,只要在程序中禁止Cache的使用,存储器中写入的数据将不再发生错误,程序可以正常运行,但速度明显减慢。经过分析,认为问题是由于Cache数据与主存数据的不一致性造成的。

Cache数据与主存数据不一致是指:在采用Cache的系统中,同样一个数据可能既存在于Cache中,也存在于主存中,两者数据相同则具有一致性,数据不相同就叫做不一致性。如果不能保证数据的一致性,那么,后续程序的运行就要出现问题。

2 分析Cache的一致性问题

要解释Cache的一致性问题,首先要了解Cache的工作模式。Cache的工作模式有两种:写直达模式(writethrough)和写回模式(writeback)。写直达模式是,每当CPU把数据写到Cache中时,Cache控制器会立即把数据写入主存对应位置。所以,主存随时跟踪Cache的最新版本,从而也就不会有主存将新数据丢失这样的问题。此方法的优点是简单,缺点是每次Cache内容有更新,就要对主存进行写入操作,这样会造成总线活动频繁。S3C44B0X中的Cache就是采用的写直达模式(writethrough)。在写直达模式下,数据输出时,系统会把数据同时写入高速缓冲存储器Cache和主存中,这样就保证了输出时高速缓冲存储器的一致性。但该模式下,却无法保证输入时的高速缓冲存储器的一致性。

下面再看一下Cache的组织方式。按照主存和Cache之间的映像关系,Cache有三种组织方式。全相联方式、直接映像方式和组相联方式。其中,直接映像方式的原理如图1所示。


图1直接映像示意图

按照Cache的行数m,把主存分为n/m个区域,每个区中有m个存储块。各区中的0~(m-1)块一一对应地固定映射到Cache中L0~Lm-1行。这样,标签只要给定区地址(区号),就能唯一确定Cache行与存储器的对应关系。当CPU发出存储器访问时,以存储器地址作为行索引,寻址到一高速缓冲行,检测该行的标签。若标签与存储器的相应地址匹配,则Cache命中。该高速缓存行当前即为欲访问存储块的唯一映像。从上面的分析可以看出,在写直达模式下,由于每次Cache内容有更新,就要对主存进行写入操作,造成总线活动频繁。在Cache命中的过程中,如果总线遇到干扰,就会出现数据不一致的现象。

3 Cache一致性问题的解决方法

该问题可以从软件及硬件两方面着手解决。

3.1 软件解决的方法

S3C44B0X的Cache提供完整的Cache使能和禁止操作模式。能够通过设置SYSCFG寄存器中CM域中的值为01或11来使能Cache(其中,01为使能4 KB Cache, 11为使能8 KB Cache),而通过清除SYSCFG寄存器中[2:1]域为0来禁止Cache功能。用禁止Cache的方法来消除数据不一致性问题,具体代码如下:


另外,S3C44B0X还提供了2个不能Cache访问的区域(noncacheable area)。每个区域要求两个Cache控制域,用来表明每一个不能Cache访问区域的起始和结束地址。在不能Cache访问的区域,当Cache没有命中,一个读的时候,Cache不能更新。在已知影响到数据不一致的地址情况下,可以在使能Cache的条件下,用设定不能Cache访问区域的方法,防止产生数据不一致现象。有时,如果数据区域被安排在不能Cache区域,程序执行速度更高,因为多数变量是不能重用的。对于不能重用的变量,刷新16 B的Cache存储器是浪费的。本系统中设定不能Cache访问的区域为0x2000000~0xc000000,就可以解决数据不一致问题。代码如下:

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top