有时驱动程序须要十分短的延后来与硬件同步。此时,使用jiffies值难以达到目的。这时就要用内核函数udelay和mdelay。u表示埃及字母“mu”(m)红旗linux操作系统,它代表“微”。它们的原型如下:
#include
voidudelay(unsignedlongusecs);//软件循环延后指定数量的毫秒数
voidmdelay(unsignedlongmsecs);//使用udelay做循环
该函数在绝大多数体系结构上是作为内联函数编译的。udelay函数里要用到BogoMips值:它的循环基于整数值loops_per_second,这个值是在引导阶段估算BogoMips时得到的结果。udelay函数只能用于获取较短的时间延后linux内核延时函数,由于loops_per_second值的精度只有8位,所以,当估算更长的延后时会积累出相当大的偏差。虽然最大能容许的延后将近1s(由于更长的延后就要溢出),推荐的udelay函数参数最大值是取1000us(1ms)。当延后小于11ms时可以使用函数mdelay。许多驱动程序须要将任务延后到之后处理,但又不想利用中断。Linux因此提供了三种方式:任务队列、tasklet和内核定时器。
要非常注意的是udelay是个忙等待函数linux内核延时函数,在延后的时间段内难以运行其他的任务。源码见头文件。
目前内核不支持小于1纳秒而大于1个时钟滴答的延后,但这不是个问题,由于延后是给硬件或则人去辨识的。百分之1秒的时间间隔对人来说延后精度足够了,而1纳秒对硬件来说延后时间也足够长。假如你真的须要其间的延后间隔查看系统版本linux,你只要构建一个连续执行udelay(1000)函数的循环。
linux内核延时函数代码示例:
1、#include
voiddo_gettimeofday(structtimeval
本文原创地址://gulass.cn/xlzmmmnhyshs.html编辑:刘遄,审核员:暂无