免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: zhangxujun1981
打印 上一主题 下一主题

[其它] 程序运行速度疑问 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2010-10-25 14:14 |只看该作者
本帖最后由 zhangxujun1981 于 2010-10-25 14:20 编辑

void TestSysCallSpeed(void)
{
        int i;

        for(i=0;i<9000000;i++){
                (*(volatile short *)(GBankAddr)=0);
                (*(volatile short *)(GBankAddr)=1);
                (*(volatile short *)(GBankAddr)=0);
                (*(volatile short *)(GBankAddr)=1);
                (*(volatile short *)(GBankAddr)=0);
                (*(volatile short *)(GBankAddr)=1);
        }
}       

Test.o:     file format elf32-littlearm

Disassembly of section .text:

00000f40 <TestSysCallSpeed>:
     f40:        e59f3040         ldr        r3, [pc, #64]        ; f88 <TestSysCallSpeed+0x48>
     f44:        e59f2040         ldr        r2, [pc, #64]        ; f8c <TestSysCallSpeed+0x4c>
     f48:        e5933000         ldr        r3, [r3]
     f4c:        e3a01000         mov        r1, #0        ; 0x0
     f50:        e1c310b0         strh        r1, [r3]
     f54:        e3a01001         mov        r1, #1        ; 0x1
     f58:        e1c310b0         strh        r1, [r3]
     f5c:        e3a01000         mov        r1, #0        ; 0x0
     f60:        e1c310b0         strh        r1, [r3]
     f64:        e3a01001         mov        r1, #1        ; 0x1
     f68:        e1c310b0         strh        r1, [r3]
     f6c:        e3a01000         mov        r1, #0        ; 0x0
     f70:        e1c310b0         strh        r1, [r3]
     f74:        e2522001         subs        r2, r2, #1        ; 0x1
     f78:        e3a01001         mov        r1, #1        ; 0x1
     f7c:        e1c310b0         strh        r1, [r3]
     f80:        1a0003d1         bne        1ecc <TestWinDr+0x16c>
     f84:        e1a0f00e         mov        pc, lr
     f88:        00000000         andeq        r0, r0, r0
     f8c:        00895440         addeq        r5, r9, r0, asr #8

-------------------------------------------------------------------------------

void TBank(void)
{
       
        (*(volatile short *)(GBankAddr)=0);
        (*(volatile short *)(GBankAddr)=1);
        (*(volatile short *)(GBankAddr)=0);
        (*(volatile short *)(GBankAddr)=1);
        (*(volatile short *)(GBankAddr)=0);
        (*(volatile short *)(GBankAddr)=1);
       
}       

t.o:     file format elf32-littlearm

Disassembly of section .text:

00000000 <Tbank>:
   0:        e59f1038         ldr        r1, [pc, #56]        ; 40 <.text+0x40>
   4:        e3a00001         mov        r0, #1        ; 0x1
   8:        e3a0c000         mov        ip, #0        ; 0x0
   c:        e5913000         ldr        r3, [r1]
  10:        e1c300b0         strh        r0, [r3]
  14:        e5912000         ldr        r2, [r1]
  18:        e1c2c0b0         strh        ip, [r2]
  1c:        e5913000         ldr        r3, [r1]
  20:        e1c300b0         strh        r0, [r3]
  24:        e5912000         ldr        r2, [r1]
  28:        e1c2c0b0         strh        ip, [r2]
  2c:        e5913000         ldr        r3, [r1]
  30:        e1c300b0         strh        r0, [r3]
  34:        e5912000         ldr        r2, [r1]
  38:        e1c2c0b0         strh        ip, [r2]
  3c:        e12fff1e         bx        lr
  40:        00000000         .word        0x00000000

第一个是应用程序,第二个是驱动程序.好像没有什么区别.可能是你上面说的关于cache 使用的不一样吧.我马上试一试.
像for(i=0;i<50;i++)这样运行很快是意料之中的事情,cpu的主频是667M,而且是8级流水线的arm11

论坛徽章:
0
12 [报告]
发表于 2010-10-25 14:24 |只看该作者
void TestSysCallSpeed(void)
{
        int i;

        for(i=0;i<9000000;i++){
                (*(volatile short *)(GBankAddr)=0);
                (*(volatile short *)(GBankAddr)=1);
                (*(volatile short *)(GBankAddr)=0);
                (*(volatile short *)(GBankAddr)=1);
                (*(volatile short *)(GBankAddr)=0);
                (*(volatile short *)(GBankAddr)=1);
        }
}       

Test.o:     file format elf32-littlearm

Disassembly of section .text:

00000f40 <TestSysCallSpeed>:
     f40:        e59f3040         ldr        r3, [pc, #64]        ; f88 <TestSysCallSpeed+0x48>
     f44:        e59f2040         ldr        r2, [pc, #64]        ; f8c <TestSysCallSpeed+0x4c>
     f48:        e5933000         ldr        r3, [r3]
     f4c:        e3a01000         mov        r1, #0        ; 0x0
     f50:        e1c310b0         strh        r1, [r3]
     f54:        e3a01001         mov        r1, #1        ; 0x1
     f58:        e1c310b0         strh        r1, [r3]
     f5c:        e3a01000         mov        r1, #0        ; 0x0
     f60:        e1c310b0         strh        r1, [r3]
     f64:        e3a01001         mov        r1, #1        ; 0x1
     f68:        e1c310b0         strh        r1, [r3]
     f6c:        e3a01000         mov        r1, #0        ; 0x0
     f70:        e1c310b0         strh        r1, [r3]
     f74:        e2522001         subs        r2, r2, #1        ; 0x1
     f78:        e3a01001         mov        r1, #1        ; 0x1
     f7c:        e1c310b0         strh        r1, [r3]
     f80:        1a0003d1         bne        1ecc <TestWinDr+0x16c>
     f84:        e1a0f00e         mov        pc, lr
     f88:        00000000         andeq        r0, r0, r0
     f8c:        00895440         addeq        r5, r9, r0, asr #8

-------------------------------------------------------------------------------

void TBank(void)
{
       
        (*(volatile short *)(GBankAddr)=0);
        (*(volatile short *)(GBankAddr)=1);
        (*(volatile short *)(GBankAddr)=0);
        (*(volatile short *)(GBankAddr)=1);
        (*(volatile short *)(GBankAddr)=0);
        (*(volatile short *)(GBankAddr)=1);
       
}       

t.o:     file format elf32-littlearm

Disassembly of section .text:

00000000 <Tbank>:
   0:        e59f1038         ldr        r1, [pc, #56]        ; 40 <.text+0x40>
   4:        e3a00001         mov        r0, #1        ; 0x1
   8:        e3a0c000         mov        ip, #0        ; 0x0
   c:        e5913000         ldr        r3, [r1]
  10:        e1c300b0         strh        r0, [r3]
  14:        e5912000         ldr        r2, [r1]
  18:        e1c2c0b0         strh        ip, [r2]
  1c:        e5913000         ldr        r3, [r1]
  20:        e1c300b0         strh        r0, [r3]
  24:        e5912000         ldr        r2, [r1]
  28:        e1c2c0b0         strh        ip, [r2]
  2c:        e5913000         ldr        r3, [r1]
  30:        e1c300b0         strh        r0, [r3]
  34:        e5912000         ldr        r2, [r1]
  38:        e1c2c0b0         strh        ip, [r2]
  3c:        e12fff1e         bx        lr
  40:        00000000         .word        0x00000000

第一个是应用程序,第二个是驱动程序.没有太大区别.
由于CPU的主频是667M,8级流水线的arm11,所以像for(i=0;i<50;i++)这样的指令本身就执行的很快.

论坛徽章:
0
13 [报告]
发表于 2010-10-25 14:28 |只看该作者
说实话我很怀疑我的解释哈.

恩,从反汇编来看,第一个程序的r2就是i.
f8c:        00895440,  f8c放的就是9000000.i的访问没涉及到内存

不过从你的代码来看,我有个疑问,你的driver中没有循环哈.而你的应用是在循环中完成的.那么不排除调度延迟.你示波器对第一个应用输出的波形整齐吗?

论坛徽章:
0
14 [报告]
发表于 2010-10-25 14:33 |只看该作者
本帖最后由 zhangxujun1981 于 2010-10-25 14:40 编辑

是这样的,驱动程序没有使用循环,而是在用户程序中这样调用的:
for(i=0;i<80000000;i++){
        ioctl(Gfd_misc,45,0);
}
驱动程序:
case 45:
                Tbank();
                break;

波形很整齐,不是随机的.应该不是调度引起的,因为只有几百ns,而且每次都是这样.我的图形只是其中的一个周期

论坛徽章:
0
15 [报告]
发表于 2010-10-25 14:36 |只看该作者
struct file_operations skeleton_fops = {
        .owner        =        THIS_MODULE,
        .llseek        =        NULL,
        .read                =        skeleton_read,
        .write        =        skeleton_write,
        .readdir        =        NULL,
        .poll                =        NULL,
        .ioctl        =        skeleton_ioctl,
        .mmap                =        skeleton_mmap,
        .open                =        skeleton_open,
        .flush        =        NULL,
        .release        =        skeleton_release,
        .fsync        =        NULL,
        .fasync        =        NULL,
        .lock                =        NULL,
};

请问,我要在驱动程序里添加mmap函数,并且实现你说的映射吗?

论坛徽章:
0
16 [报告]
发表于 2010-10-25 14:46 |只看该作者
回复 15# zhangxujun1981


    en
去抄一个比如fbmem.c里面的fb_mmap吧

论坛徽章:
0
17 [报告]
发表于 2010-10-25 16:55 |只看该作者
大侠,好像是这样的,我试了一下,应用程序的速度提高了,和内核速度差不多也.佩服佩服!

论坛徽章:
0
18 [报告]
发表于 2010-10-25 17:01 |只看该作者
呵呵,那太好了

论坛徽章:
0
19 [报告]
发表于 2010-10-25 17:03 |只看该作者
大侠的学识真令人佩服,以后请多多指教!

论坛徽章:
0
20 [报告]
发表于 2010-10-27 14:35 |只看该作者
回复  zhangxujun1981


    arm的细节记不清楚了.大致这么解释

kernel mode时,ioremap本身是non-ca ...
snail_314 发表于 2010-10-25 13:34



nod
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP