觉得这句话说的还行 合理的配置是打开对RAM区间的Cache,关闭对其它地址区间(非存储器设备,I/O设备 )的Cache。
具体解释如下
44B0处理器将寻址的空间分为cache区和非cache区,cache区就是读写都采用cache机制的区域,non-cache区则不采用。一般flash、sdram等存储器都作为cache区,I/O设备都作为non-cache区。
rNCACHBE0,rNCACHBE1是non-cache区的地址范围设定寄存器。
一般数据会因为CPU的读写操作而改变数据内容的设为cache区。例如flash的读操作,如果是一段循环的程序,使用cache后这段程序可能都读入到cache中,CPU在取指时只需要读取内部SRAM,也就是cache中的内容,这样会大大加快程序执行的速度。当然flash并不总是作为cache区,就像whl223兄所说,在写flash时,如果不是写穿式的,flash的内容可能得不到即使的更新。
而一般数据会因为外接的因素改变的,就作为non-cache区,典型的例如串口、网口。如果采用cache,则发往这些设备的数据不能及时发出去,而读取设备时,也不能读到最新的接收数据了,所以一定要作为non-cache。
共享一些知识:
在CPU与主存之间增加了Cache之后,便存在数据在CPU和Cache及主存之间如何存取的问题。读写各有2种方式。
贯穿读出式(Look Through)
该方式将Cache隔在CPU与主存之间,CPU对主存的所有数据请求都首先送到Cache,由Cache自行在自身查找。如果命中,则切断CPU对主存的请求,并将数据送出;不命中,则将数据请求传给主存。
该方法的优点是降低了CPU对主存的请求次数,缺点是延迟了CPU对主存的访问时间。
旁路读出式(Look Aside)
在这种方式中,CPU发出数据请求时,并不是单通道地穿过Cache,而是向Cache和主存同时发出请求。由于Cache速度更快,如果命中,则Cache在将数据回送给CPU的同时,还来得及中断CPU对主存的请求;不命中,则Cache不做任何动作,由CPU直接访问主存。
它的优点是没有时间延迟,缺点是每次CPU对主存的访问都存在,这样,就占用了一部分总线时间。
写穿式(Write Through)
任一从CPU发出的写信号送到Cache的同时,也写入主存,以保证主存的数据能同步地更新。
它的优点是操作简单,但由于主存的慢速,降低了系统的写速度并占用了总线的时间。
回写式(Copy Back)
为了克服贯穿式中每次数据写入时都要访问主存,从而导致系统写速度降低并占用总线时间的弊病,尽量减少对主存的访问次数,又有了回写式。
它是这样工作的:数据一般只写到Cache,这样有可能出现Cache中的数据得到更新而主存中的数据不变(数据陈旧)的情况。但此时可在Cache 中设一标志地址及数据陈旧的信息,只有当Cache中的数据被再次更改时,才将原更新的数据写入主存相应的单元中,然后再接受再次更新的数据。这样保证了Cache和主存中的数据不致产生冲突。
/
1、cache区可以存储整个系统中的任何数据.但是它不能跟踪外部存储器数据的变化.只有CPU对外部数据进行读写操作cache区才会随之更新.
2、非cache区正好补充了cache区这一缺陷.它会自动跟踪外部数据变化.
再来看一下程序ROM flash的写操作:
while (len--) {
tmp = *data;
*current_flash->CMD_ADDR0 = 0xaaaa;
*current_flash->CMD_ADDR1 = 0x5555;
*current_flash->CMD_ADDR0 = 0xa0a0;
*addr = tmp;
count = 10000;
while (--count && ((tmp2=*addr) != tmp));
if (count == 0)
break;
addr++;
data++;
情况(a):如果使用了cache区,那么cache区是采用write-throuht(写穿式).当然也同时更新了cache区的内容.这时外部flash数据发生了改变cache跟踪不到.最终的结果是数据并没真正写入flash就被认为是已经写入了.(但情况并非一定是这样,也可能是成功的.原因好好想想吧)
情况(b):如果使能了非cache区,那么非cache区的内容就会一直保持与flash数据一致.这样在数据未真真写入flash之前,就不会误认为已经完成写操作了.
与此道理相同.为了保证IO读取数据一致性,其地址已应列入non-cacheable区.(DMA存储器也一样)
注:对CACHE的另类解释,可以把CACHE内存储的内容看做是主存的一段存储(即所设定的catch区)内容及地址的映像(可理解为COPY),正常工作时更新catch同时更新主存(写穿式同步更新可靠性高)。