powerPC8541,DDR2(300M或500M),vxworks6.4下的一段程序,CPM的计数器配置为144ns计
数一次。
CPM的计数器清零;
一段其它代码A;
count[0]=CPM的计数器;
//WRS_ASM("lis r17, 0x1ba0e94@h");
//WRS_ASM("lbz r18, 0x0e94(r17)");
count[1]=CPM的计数器;
一段其它代码B;
没有那两行的嵌入汇编代码,count[1]-count[0]=0或1,
加入那两行的嵌入汇编代码,count[1]-count[0]=25,
也就是说访问0x1bacf94用了3us的时间。大约是从DDR内存拷贝4k字节数据的时间
在shell下修改那两行机器码,以改为访问其它范围的内存,结果如下
访问0x1bab000~0x1babfff时 count[1]-count[0]=0或1,
访问0x1bac000~0x1bad000时 count[1]-count[0]=25,
访问0x1bad001~0x1badfff时 count[1]-count[0]=0或1,
访问0x1bae000~0x1baefff时 count[1]-count[0]=0或1,
出现异常的是0x1bac000~0x1bad000这一段(4k字节)。
但单独用memcpy拷贝0x1bac000~0x1bad000这4k数据,耗时和拷贝其它内存一样。
现象可反复重现,可排除任务调度的影响。
奇怪的是为何一条访问内存的指令会耗时这么长?
cache或TLB不命中都应该不会导致3us长的延时的, |