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了?
做过驱动的瞧一瞧看一看呗
贴iowrite16 NJ8888 发表于 2015-9-30 21:08
贴iowrite16
iowrite16是标准的linux函数调用
(#include "asm/uaccess.h"
#include "asm/io.h")
或者是writew也一样
是16位字节的读写 你是每次都感觉15ms还是有时很短10us级别有时15ms,如果是这样,那是系统时间片关系 NJ8888 发表于 2015-9-30 21:15
你是每次都感觉15ms还是有时很短10us级别有时15ms,如果是这样,那是系统时间片关系 ...
每次都是15ms
系统时间片不至于那么大 逻辑分析仪采样
你会不会mmap直接映射用户空间数据到内核省了数据搬移工作?我以前研究linux下操作,用IO配合示波器看个部分,另外启用了一个系统没用的定时器精度1us级别,在关键路径记录操作时间戳,函数执行完打印信息,分析那边消耗时间过多。 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. NJ8888 发表于 2015-9-30 21:27
你会不会mmap直接映射用户空间数据到内核省了数据搬移工作?我以前研究linux下操作,用IO配合示波器看个部 ...
mmap,看到过这么做的,的确可以研究下 我做的系统,开始做有个机制,控制器发送一串命令给FPGA然后等执行完毕发送另外一个命令,但试验发现有时间隔10ms才把第二个命令发出去,分析是刚好碰到系统换时间片导致我查询功能挂起,之后重写FPGA代码,控制器发送命令FPGA自己把这两件事干完。 NJ8888 发表于 2015-9-30 21:27
你会不会mmap直接映射用户空间数据到内核省了数据搬移工作?我以前研究linux下操作,用IO配合示波器看个部 ...
问题解决了,{:biggrin:}
是我在驱动里面printk消耗了了时间
把printk注释掉就好了 逻辑分析仪抓的数据
内核的printk和用户空间的printf还不一样,printf不会阻塞的,printk估计阻塞了,干完它后再干其它事情
ziruo2002ab 发表于 2015-9-30 21:43
逻辑分析仪抓的数据
内核的printk和用户空间的printf还不一样,printf不会阻塞的,printk估计阻塞了,干完 ...
从你贴出的代码看,失败才printk,正常不进printk,所以我前面没考虑这个时间。我知道printk是要先执行的 好多了,现在读写花的时间大概几个us
还有很大进步的空间 NJ8888 发表于 2015-9-30 21:46
从你贴出的代码看,失败才printk,正常不进printk,所以我前面没考虑这个时间。我知道printk是要先执行的 ...
哦我以为不重要,把一些printk常用信息的代码段给忽略掉了,惭愧
页:
[1]