驱动精确延时 如何设计?
本帖最后由 oyjcq 于 2010-09-09 15:48 编辑我现在做的一个设备驱动 需要往串口发送两个字节来模拟控制命令
两个字节之间的delay是确定的7.5ms.
BYTE1-delay-BYTE2
现在发现大多数情况下命令都能正确发送, 但偶尔会发现命令不对, 通过示波器抓包发现是BYTE1 和BYTE2之间的延迟超过了实际的长度
猜测是因为任务调度造成的, 不知道有没有办法避免这个情况。
之前说错了 硬件平台是mips的, 版本linux-2.6.1-10 HZ = 100
谢谢 驱动精确延时可以用纳秒级的啊 回复 2# zjzhangxin
现在不是精度问题, 是发送两个字节之间被调度了, 根据HZ=100 调度一下至少10ms了, 所以本来要延迟7.5ms的就变成17.5以上了
有没有办法可以保证在一个时间片下完成发送字节1 延迟 发送字节2 三个操作? 发送是通过定时器触发的还是什么其他方式? arm 不是很懂,不过知道x86和mips里都有精度特别高的寄存器用来打时间戳(按照cpu主频++的),我一般用这个打时间戳找性能瓶颈的,这个反正精度足够了,arm底下不知道有类似的寄存器没有,如果有的话可以用这个,但还得保证在此过程中不会被调度出去。。。 回复 4# shank941
发送是由上层app通过ioctl接口来控制.
驱动处理相应的ioctl 然后调用发送的过程 用 ioctl 来控制驱动发送,在驱动里,通过设置 cpu提供的 timer register ,可以达到ms , 级别的精度。
也可以 把中断关了, 调用 udelay ( ) 延时 7.5ms,不过 这7.5 ms, 系统就不能对外设做反应了。 回复 7# goldenfort
能具体介绍一下两种方法在驱动里的实现吗? 回复 8# oyjcq
我大概说一下。
第一种, 先发一个字节, 然后 设置好 cpu的 timer register, 和对应的中断服务程序。到期后,在中断服务程序里,发第二字节。
第二种, 把中断关了, 发完第一个字节后 调用 udelay(7500), 然后再发送第2个字节,然后再把中断打开。 回复oyjcq
我大概说一下。
第一种, 先发一个字节, 然后 设置好 cpu的 timer registe ...
goldenfort 发表于 2010-09-09 16:07 http://linux.chinaunix.net/bbs/images/common/back.gif
高手!
页:
[1]
2