当前位置:嗨网首页>书籍在线阅读

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()则可以被打断。

BZ___229_134_1251_211_1328.png 受系统Hz以及进程调度的影响,msleep()类似函数的精度是有限的。