免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 9192 | 回复: 17
打印 上一主题 下一主题

驱动精确延时 如何设计? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-09-09 14:59 |只看该作者 |倒序浏览
本帖最后由 oyjcq 于 2010-09-09 15:48 编辑

我现在做的一个设备驱动 需要往串口发送两个字节来模拟控制命令
两个字节之间的delay是确定的7.5ms.

BYTE1-delay-BYTE2

现在发现大多数情况下命令都能正确发送, 但偶尔会发现命令不对, 通过示波器抓包发现是BYTE1 和BYTE2之间的延迟超过了实际的长度

猜测是因为任务调度造成的, 不知道有没有办法避免这个情况。

之前说错了 硬件平台是mips的, 版本linux-2.6.1-10   HZ = 100

谢谢

论坛徽章:
0
2 [报告]
发表于 2010-09-09 15:12 |只看该作者
驱动精确延时可以用纳秒级的啊

论坛徽章:
0
3 [报告]
发表于 2010-09-09 15:21 |只看该作者
回复 2# zjzhangxin


    现在不是精度问题, 是发送两个字节之间被调度了, 根据HZ=100 调度一下至少10ms了, 所以本来要延迟7.5ms的就变成17.5以上了

有没有办法可以保证在一个时间片下完成发送字节1 延迟 发送字节2 三个操作?

论坛徽章:
0
4 [报告]
发表于 2010-09-09 15:24 |只看该作者
发送是通过定时器触发的还是什么其他方式?

论坛徽章:
0
5 [报告]
发表于 2010-09-09 15:30 |只看该作者
arm 不是很懂,不过知道x86和mips里都有精度特别高的寄存器用来打时间戳(按照cpu主频++的),我一般用这个打时间戳找性能瓶颈的,这个反正精度足够了,arm底下不知道有类似的寄存器没有,如果有的话可以用这个,但还得保证在此过程中不会被调度出去。。。

论坛徽章:
0
6 [报告]
发表于 2010-09-09 15:31 |只看该作者
回复 4# shank941


    发送是由上层app通过ioctl接口来控制.

    驱动处理相应的ioctl 然后调用发送的过程

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2010-09-09 15:55 |只看该作者
用 ioctl 来控制驱动发送,  在驱动里,通过设置 cpu提供的 timer register ,可以达到  ms , 级别的精度。

也可以 把中断关了, 调用 udelay ( ) 延时 7.5ms,  不过 这7.5 ms, 系统就不能对外设做反应了。

论坛徽章:
0
8 [报告]
发表于 2010-09-09 15:59 |只看该作者
回复 7# goldenfort


    能具体介绍一下两种方法在驱动里的实现吗?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2010-09-09 16:07 |只看该作者
回复 8# oyjcq


    我大概说一下。

     第一种, 先发一个字节, 然后 设置好 cpu的 timer register,   和对应的中断服务程序。  到期后,在中断服务程序里,发第二字节。
   
     第二种, 把中断关了, 发完第一个字节后 调用 udelay(7500), 然后再发送第2个字节,然后再把中断打开。

论坛徽章:
0
10 [报告]
发表于 2010-09-09 16:19 |只看该作者
回复  oyjcq


    我大概说一下。

     第一种, 先发一个字节, 然后 设置好 cpu的 timer registe ...
goldenfort 发表于 2010-09-09 16:07



    高手!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP