打印

请教ARM中的non-cache怎么理解

[复制链接]
5206|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hbsun2007|  楼主 | 2010-11-5 20:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教一个问题:HF44B0中DMA.c程序有部分不太理解
    dst=(unsigned char *)malloc(0x80000);
    src=(unsigned char *)malloc(0x80000);
//目的是分配两段空间
//================================
for(i=0;i<0x80000;i++)
*(src+i)=0x1;
//将src指向的区域初始化成1
    Zdma0Int((int)src,(int)dst,0x80000,2); //word
//启动DMA操作,将src指向的区域数据复制给dst指向的数据
    for(i=0;i<0x80000;i++)
memSum+=*(dst+i);
Uart_Printf("memSum=%8x:",memSum);
    if(memSum==0x100000)Uart_Printf("O.K.\n");
    else Uart_Printf("ERROR!!!\n");
//验证dst指向区域的内容是否为1


rNCACHBE1=( ( (((unsigned)dst+0x100000)>>12) +1 )<<16 )|((unsigned)dst>>12);

1。不理解的是,为什么要设置non-cache?   

2。作为non-cache区,典型的例如串口、网口,我想知道,这里的串口,网口是指 串口芯片,网口芯片中的存储单元,还是指就是从FLASH或者SDRAM中剥离一段区域作为non-cache。。。

初学ARM这个问题没有弄清楚,请各位大虾不吝赐教,谢谢了

相关帖子

沙发
hbsun2007|  楼主 | 2010-11-7 10:56 | 只看该作者
有人帮忙一下么?困惑。。。

使用特权

评论回复
板凳
sixgett| | 2010-11-7 17:32 | 只看该作者
44B0处理器将寻址的空间分为cache区和非cache区,cache区就是读写都采用cache机制的区域,non-cache区则不采用。一般flash、sdram等存储器都作为cache区,I/O设备都作为non-cache区。



rNCACHBE0,rNCACHBE1是non-cache区的地址范围设定寄存器。

使用特权

评论回复
地板
sixgett| | 2010-11-7 17:34 | 只看该作者
情况(a):如果使用了cache区,那么cache区是采用write-throuht(写穿式).当然也同时更新了cache区的内容.这时外部flash数据发生了改变cache跟踪不到.最终的结果是数据并没真正写入flash就被认为是已经写入了.(但情况并非一定是这样,也可能是成功的.原因好好想想吧)



情况(b):如果使能了非cache区,那么非cache区的内容就会一直保持与flash数据一致.这样在数据未真真写入flash之前,就不会误认为已经完成写操作了.



与此道理相同.为了保证IO读取数据一致性,其地址已应列入non-cacheable区.(DMA存储器也一样)

使用特权

评论回复
5
sixgett| | 2010-11-7 17:36 | 只看该作者
我也是看别人的,你就参考一下吧,我觉得很有道理!

使用特权

评论回复
6
sixgett| | 2010-11-7 17:38 | 只看该作者
一般将数据会因为CPU的读写操作而改变数据内容的设为cache区。例如flash的读操作,如果是一段循环的程序,使用cache后这段程序可能都读入到cache中,CPU在取指时只需要读取内部SRAM,也就是cache中的内容,这样会大大加快程序执行的速度。当然flash并不总是作为cache区,在写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和主存中的数据不致产生冲突。

使用特权

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

本版积分规则

25

主题

87

帖子

0

粉丝