原来用寄存器访问的方式操作PIO,Timer等设备(跟黑金教程学的),感觉非常好用。这两天,却被这东西纠结着,无法用寄存器访问的方式操作设备了。刚才百度了一下,发现一篇文章描述是因为Nios CPU用了Nios II/f的原因。想想,的确是换了CPU。
现在摘录原文如下,只是怕麻烦所以自己没有尝试,哪位试过了告知一下,谢谢。
在NIOS II/f中,DATA CACHE(数据高速缓存)被打开了,在其他两种CPU中这个地方时灰的不能用的,就是说只有NIOS II/f数据高级缓存才打开的。
那Data Cache到底是什么呢,芯片手册上是这样介绍的,(引自《n2cpu_nii5v1.pdf》的2-12页)
Cache memory resides on-chip as an integral part of the Nios II processor core. The cache memories can improve the average memory access time for Nios II processor systems that use slow off-chip memory such as SDRAM for program and data storage.
简单的说,Data Cache是像电脑的一级缓存二级缓存一样的东东,就是为了提高系统速度的。可是有个这个高速缓冲区后,我们的代码执行时间却变得不可确定了,降低了程序 的实时性。我们发出的数据,放到了高速缓冲区里而没有及时的去执行才导致代码不执行,没有显示效果。想要了解Cache memory相关内容的可以参考http://www.altera.com/literature/hb/nios2 /n2sw_nii52007.pdf
既然知道原因了,那我们该如何解决呢。方法有两个:
第一种就是在建立NIOS II/f的时候,将Data Cache设置为0,就是说关闭Data Cache。如下图所示,这样就不存在Dache Cache了,这个办法彻底吧。
第二种是在开启了Data Cache前提下,通过软件来解决。http://www.altera.com/literature/hb/nios2 /n2sw_nii52007.pdf这里面有所介绍,就是通过31-bit Cache bypass。什么意思呢,很简单,NIOS II将寄存器的第31位作为了Cache 开启与否的控制位,如果此位为1,则Cache关闭不启用,否则就开启。一般情况我们是不会注意到这个的,所以才会出现无法控制LED的情况。我们把最简 单的程序修改一下,如下所示:
1 #include <unistd.h>
2 #include "system.h"
3
4
5 #define LED *(volatile unsigned long *)(LED_BASE | (1 << 31) //这个地方要注意了,多了(1<<31)
//这就是bypass Cache,关闭Cache
6
7 int main(void)
8
9 {
10
11 while(1){
12
13 LED = 1;
14 usleep(100000);
15 LED = 0;
16 usleep(100000);
17 }
18
19 return 0;
20 }
两种方法都讲完了,我更推荐第一种,斩草除根式。大家要注意,只有使用NIOS II/f这种类型的CPU才会出现这种问题。
浙公网安备 33010602011771号