Linux 下的延时函数分为用户空间延时和内核空间的延时.

用户空间:
最常用的延时函数是sleep(),但是其时间延时精确到s,不能满足很多情况下的要求。
在linux下,有一个延时函数,可以精确到us级,那就是usleep(),比如要延时一妙,usleep(1000000);

内核空间:
udelay(int n);  延时n微秒
mdelay(int n);  延时n毫秒
ndelay(int n);  延时n纳秒

头文件:include/asm-???/delay.h中定义了udelay(),而include/linux/delay.h中定义了mdelay和ndelay.

 

linux C函数:
void usleep(int micro_seconds);
把进程挂起一段时间, 单位是微秒(百万分之一秒);
头文件unistd.h
==============================================================
对于内核空间的延时函数
void ndelay(unsigned long nsecs);

void udelay(unsigned long usecs);//udelay一般适用于一个比较小的delay,如果你填的数大于2000,系统会认为你这个是一个错误的delay函数,因此如果需要2ms以上的delay需要使用mdelay函数。

void mdelay(unsigned long msecs);


这3个函数的延时原理是忙等待,也就是说在延时的过程中并没有放弃cpu,根据cpu的频率进行一定次数的循环。同时这三个函数的延时是准确的。

在内核中对于毫秒级以上的延时,最好不要直接使用mdelay函数,这将无谓的浪费cpu的资源,对于毫秒级以上的延时,内核提供了下列函数:

void msleep(unsigned int millisecs);

unsigned long msleep_interruptible(unsigned int milosecs);

void ssleep(unsigned int seconds);
这三个函数时休眠函数,不会忙等待

注:受系统HZ以及进程调度的影响,msleep类似函数的精度是有限的。msleep是休眠函数,它不涉及忙等待.你如果是msleep(10),那实际上延迟的时间,大部分时候是要多于10ms的,是个不定的时间

值.

 

Logo

更多推荐