新闻中心

EEPW首页 > 电源与新能源 > 设计应用 > Cache在嵌入式处理器中的使用问题

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

——
作者:作者:西北工业大学 王艳 吴旭光 赵勋峰 时间:2007-01-26 来源:《单片机与嵌入式系统应用》 收藏


随着嵌入式计算机应用的发展,嵌入式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所示。

本文引用地址:https://www.eepw.com.cn/article/20750.htm


按照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的方法来消除数据不一致性问题,具体代码如下:

   #define rsyscfg(*(volatile unsigned *)0x1c00000)

   #define wrbufopt (0x8)  //write_buf_on

   #define syscfg_0kb (0x0|wrbufopt)

   #define syscfg_4kb (0x2|wrbufopt)

   #define syscfg_8kb (0x6|wrbufopt)

   #define cachecfgsyscfg_0kb

   rsyscfg= cachecfg;    //禁止cache

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

   #define rsyscfg(*(volatile unsigned *)0x1c00000)

   #define wrbufopt (0x8)    //write_buf_on

   #define syscfg_0kb (0x0|wrbufopt)

   #definesyscfg_4kb (0x2|wrbufopt)

   #define syscfg_8kb (0x6|wrbufopt)

   #define cachecfg syscfg_8kb

   #define rncachbe0 (*(volatile unsigned *)0x1c00004)

   #define rncachbe1 (*(volatile unsigned *)0x1c00008)

   #define non_cache_start(0x2000000)
                 //不能cache访问的区域开始地址

   #define non_cache_end(0xc000000)
                 //不能cache访问的区域结束地址

   rsyscfg= cachecfg;
                 // 8 kb cache,写缓冲使能,data abort使能

   rncachbe0= ((non_cache_end>>12)<<16)|(non_cache_start>>12);//在上面的数据区域不使用高速缓存cache

采用上述两种方法,排除了数据不一致性的问题。但一个高性能的系统是需要cache的,禁止cache的使用会大大降低系统的性能。所以,在嵌入式系统的设计中,还应从硬件方面考虑,从根本上防止数据不一致的产生。

3.2 硬件的解决方法

由于现在的嵌入式处理器,主频越来越高,地址、数据线越来越多,所以在硬件的设计和焊接过程中应特别注意高频干扰的问题。因为高频干扰可以引起信号的不完整性,这些不完整的信号会引起总线传输过程中出现一些坏字节,所以高速pcb设计变得尤为重要。高速pcb设计中,对高速信号网络的特征与走线控制的设计技术,已成为高速数字设备成功与否的关键。在设计中应注意下列问题:

① 在成本允许的条件下, pcb尽量采用多层板布线。

② 高频电路布线的引线最好采用全直线,需要转折时,可以用45°折线或圆弧转折。在高频电路中,满足这一要求可以减少高频信号对外的发射和相互间的耦合。

③ 高频电路器件引脚的引线层间的交替越少越好,过孔越少越好。据测,一个过孔可带来约0.5 pf的分布电容,减少过孔数量能显著提高速度。

④ 高频电路布线要注意信号线近距离平行走线所引入的“交叉干扰”,若无法避免平行分布,可在平行信号线的反面布置大面积“地”来减少干扰。同一层内的平行走线几乎无法避免,但是在相邻的两个层,走线的方向务必取为相互垂直。

⑤ 每个集成电路块的附近应设置一个高频退耦电容。

⑥ 模拟电路和数字电路部分,应有各自独立的地线。

⑦ 对特别重要的信号线或局部单元实施地线包围的措施,各类信号走线不能形成环路,地线也不能形成电流环路。

在注意了上面的设计规则之后,制作出的pcb基本上可以满足高速信号的要求。

最后,就是在焊接时要注意焊点一定要圆滑。因为焊点的尖峰会产生很强的高频干扰。

有了上述各条规则,就保证了在信号传输过程中,总线上不会出现不必要的干扰,防止了数据不一致的发生。

结语

嵌入式处理器已经被广泛应用。本文提到的对s3c44b0x中cache数据不一致性的处理方法同样适用于其他型号的高频嵌入式处理器。掌握一些设计、调试的基本经验,可以大大提高工作效率,减小系统开发过程中不必要的麻烦。



关键词:

评论


相关推荐

技术专区

关闭