搜索
bottom↓
回复: 14

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

[复制链接]

出200入657汤圆

发表于 2015-9-30 21:02:31 | 显示全部楼层 |阅读模式
在测试程序里面调用两次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[0]<<8) | (fpga_buff[1]);
    data= (fpga_buff[2]<<8) | (fpga_buff[3]);
    //根据fpga_buff的数据和地址写io地址空间
    iowrite16(data, fpga_base+addr);

fpga_write_done:
   ......

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

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出0入0汤圆

发表于 2015-9-30 21:08:52 | 显示全部楼层
贴iowrite16

出200入657汤圆

 楼主| 发表于 2015-9-30 21:11:31 | 显示全部楼层

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

出0入0汤圆

发表于 2015-9-30 21:15:45 | 显示全部楼层
你是每次都感觉15ms还是有时很短10us级别有时15ms,如果是这样,那是系统时间片关系

出200入657汤圆

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

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

出200入657汤圆

 楼主| 发表于 2015-9-30 21:22:14 | 显示全部楼层
逻辑分析仪采样

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

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

出200入657汤圆

 楼主| 发表于 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 is  c0c
[ 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 is  c0c
[ 3019.948913]
[ 3019.948913] Before user write, count is 4, len is 4
[ 3019.955627]
[ 3019.955627] Before user write, addr is cb0000b0, data is  d0d
adcard firmware version is V12.12, serial number is 2013.013.

出200入657汤圆

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

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

出0入0汤圆

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

出200入657汤圆

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

问题解决了,

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

出200入657汤圆

 楼主| 发表于 2015-9-30 21:43:50 | 显示全部楼层
逻辑分析仪抓的数据

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-9-30 21:46:51 | 显示全部楼层
ziruo2002ab 发表于 2015-9-30 21:43
逻辑分析仪抓的数据

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

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

出200入657汤圆

 楼主| 发表于 2015-9-30 21:47:43 | 显示全部楼层
好多了,现在读写花的时间大概几个us
还有很大进步的空间

出200入657汤圆

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

哦  我以为不重要,把一些printk常用信息的代码段给忽略掉了,惭愧
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-28 21:49

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表