ziruo2002ab 发表于 2015-9-30 21:02:31

linux write函数所耗时间很长,怎么回事

在测试程序里面调用两次write,测试发现两个函数的间隔接近15ms,为什么呢
write(fpga_fd,buf,4);
write(fpga_fd,buf,4);

fpga_fd对应的驱动是自己写的,主要过程如下:

    memset(fpga_buff, 0, 4);
    //将用户空间的数据接收到fpga_buff
    if (copy_from_user(fpga_buff, buff, 4)<0)
    {
       printk("copy from user Error\n");
      status = -EFAULT;
      goto fpga_write_done;
    }       
    addr = (fpga_buff<<8) | (fpga_buff);
    data= (fpga_buff<<8) | (fpga_buff);
    //根据fpga_buff的数据和地址写io地址空间
    iowrite16(data, fpga_base+addr);

fpga_write_done:
   ......

本来这些函数都是很简单的函数,执行起来应该很快才对。最大的资源消耗恐怕是用户空间到内核空间的切换
但是对一个cortex-a8的cpu这些处理起来应该不会超过1us吧,为什么上面的两个write(fpga_fd,buf,4);实测的脉冲间隔快要15ms了?
做过驱动的瞧一瞧看一看呗

NJ8888 发表于 2015-9-30 21:08:52

贴iowrite16

ziruo2002ab 发表于 2015-9-30 21:11:31

NJ8888 发表于 2015-9-30 21:08
贴iowrite16

iowrite16是标准的linux函数调用
(#include "asm/uaccess.h"
#include "asm/io.h")
或者是writew也一样
是16位字节的读写

NJ8888 发表于 2015-9-30 21:15:45

你是每次都感觉15ms还是有时很短10us级别有时15ms,如果是这样,那是系统时间片关系

ziruo2002ab 发表于 2015-9-30 21:17:52

NJ8888 发表于 2015-9-30 21:15
你是每次都感觉15ms还是有时很短10us级别有时15ms,如果是这样,那是系统时间片关系 ...

每次都是15ms
系统时间片不至于那么大

ziruo2002ab 发表于 2015-9-30 21:22:14

逻辑分析仪采样

NJ8888 发表于 2015-9-30 21:27:33

你会不会mmap直接映射用户空间数据到内核省了数据搬移工作?我以前研究linux下操作,用IO配合示波器看个部分,另外启用了一个系统没用的定时器精度1us级别,在关键路径记录操作时间戳,函数执行完打印信息,分析那边消耗时间过多。

ziruo2002ab 发表于 2015-9-30 21:32:32

NJ8888 发表于 2015-9-30 21:27
你会不会mmap直接映射用户空间数据到内核省了数据搬移工作?我以前研究linux下操作,用IO配合示波器看个部 ...

时间戳都有,每次写大概花了10ms左右

[ 3019.888549] Before user write, count is 4, len is 4

[ 3019.895965]
[ 3019.895965] Before user write, addr is cb0000b0, data isc0c
[ 3019.904144]
[ 3019.904144] Before user write, count is 4, len is 4
[ 3019.910827]
[ 3019.910858] Before user write, addr is cb0000aa, data is 7777
[ 3019.919219]
[ 3019.919219] Before user write, count is 4, len is 4
[ 3019.925964]
[ 3019.925964] Before user write, addr is cb0000ff, data is    0
[ 3019.934234]
[ 3019.934234] Before user write, count is 4, len is 4
[ 3019.940917]
[ 3019.940917] Before user write, addr is cb0000b0, data isc0c
[ 3019.948913]
[ 3019.948913] Before user write, count is 4, len is 4
[ 3019.955627]
[ 3019.955627] Before user write, addr is cb0000b0, data isd0d
adcard firmware version is V12.12, serial number is 2013.013.

ziruo2002ab 发表于 2015-9-30 21:35:45

NJ8888 发表于 2015-9-30 21:27
你会不会mmap直接映射用户空间数据到内核省了数据搬移工作?我以前研究linux下操作,用IO配合示波器看个部 ...

mmap,看到过这么做的,的确可以研究下

NJ8888 发表于 2015-9-30 21:37:09

我做的系统,开始做有个机制,控制器发送一串命令给FPGA然后等执行完毕发送另外一个命令,但试验发现有时间隔10ms才把第二个命令发出去,分析是刚好碰到系统换时间片导致我查询功能挂起,之后重写FPGA代码,控制器发送命令FPGA自己把这两件事干完。

ziruo2002ab 发表于 2015-9-30 21:41:07

NJ8888 发表于 2015-9-30 21:27
你会不会mmap直接映射用户空间数据到内核省了数据搬移工作?我以前研究linux下操作,用IO配合示波器看个部 ...

问题解决了,{:biggrin:}

是我在驱动里面printk消耗了了时间
把printk注释掉就好了

ziruo2002ab 发表于 2015-9-30 21:43:50

逻辑分析仪抓的数据

内核的printk和用户空间的printf还不一样,printf不会阻塞的,printk估计阻塞了,干完它后再干其它事情

NJ8888 发表于 2015-9-30 21:46:51

ziruo2002ab 发表于 2015-9-30 21:43
逻辑分析仪抓的数据

内核的printk和用户空间的printf还不一样,printf不会阻塞的,printk估计阻塞了,干完 ...

从你贴出的代码看,失败才printk,正常不进printk,所以我前面没考虑这个时间。我知道printk是要先执行的

ziruo2002ab 发表于 2015-9-30 21:47:43

好多了,现在读写花的时间大概几个us
还有很大进步的空间

ziruo2002ab 发表于 2015-9-30 21:49:40

NJ8888 发表于 2015-9-30 21:46
从你贴出的代码看,失败才printk,正常不进printk,所以我前面没考虑这个时间。我知道printk是要先执行的 ...

哦我以为不重要,把一些printk常用信息的代码段给忽略掉了,惭愧
页: [1]
查看完整版本: linux write函数所耗时间很长,怎么回事