linux下的休眠与延时函数
Linux 下的延时函数分为用户空间延时和内核空间的延时.用户空间:最常用的延时函数是sleep(),但是其时间延时精确到s,不能满足很多情况下的要求。在linux下,有一个延时函数,可以精确到us级,那就是usleep(),比如要延时一妙,usleep(1000000);内核空间:udelay(int n); 延时n微秒mdelay(int n); 延时n毫秒n
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的,是个不定的时间
值.
更多推荐
所有评论(0)