15-短延迟
10.6.1 短延迟
Linux内核中提供了如下3个函数分别进行纳秒、微秒和毫秒延迟:
void ndelay(unsigned long nsecs);
void udelay(unsigned long usecs);
void mdelay(unsigned long msecs);
上述延迟的实现原理本质上是忙等待,它根据CPU频率进行一定次数的循环。有时候,人们在软件中进行这样的延迟:
void delay(unsigned int time)
{
while (time--);
}
ndelay()、udelay()和mdelay()函数的实现方式机理与此类似。内核在启动时,会运行一个延迟测试程序(delay loop calibration),计算出lpj(loops per jiffy),例如对于LDD6410电路板而言,内核启动时会打印:
Calibrating delay loop... 530.84 BogoMIPS (lpj=1327104)
毫秒时延(以及更大的秒时延)已经比较大了,在内核中,最好不要直接使用mdelay()函数,这将无谓地耗费CPU资源,对于毫秒级以上时延,内核提供了下述函数:
void msleep(unsigned int millisecs);
unsigned long msleep_interruptible(unsigned int millisecs);
void ssleep(unsigned int seconds);
上述函数将使得调用它的进程睡眠参数指定的时间,msleep()、ssleep()不能被打断,而msleep_interruptible()则可以被打断。
受系统Hz以及进程调度的影响,msleep()类似函数的精度是有限的。