第一类延时函数原型是:(忙等) ( 头文件是 #include<linux/delay.h> )
void ndelay(unsigned long nsecs);
void udelay(unsigned long usecs);
void mdelay(unsigned long msecs);
说明:内核函数 ndelay, udelay, 以及 mdelay 对于短延时好用,分别延后执行指定的纳秒数,微秒数或者毫秒数。它们涉及到的延时常常是最多几个毫秒。
第二类延时函数原型是:(使进程进入休眠)
void msleep(unsigned int millisecs);
unsigned long msleep_interruptible(unsigned int millisecs);
void ssleep(unsigned int seconds)
这类方法获得毫秒 (和更长) 延时而不用涉及到忙等待,前 2 个函数使调用进程进入睡眠给定的毫秒数.
一个对 msleep 的调用是不可中断的;你能确保进程睡眠至少给定的毫秒数.
如果你的驱动位于一个等待队列并且你想唤醒来打断睡眠,使用 msleep_interruptible. 从 msleep_interruptible 的返回值正常地是 0; 如果这个进程被提早唤醒,返回值是在初始请求睡眠周期中剩余的毫秒数。对 ssleep 的调用使进程进入一个不可中断的睡眠给定的秒数.
区别:
mdelay 是忙等待函数,在延迟过程中无法运行其他任务.这个延迟的时间是准确的.是需要等待多少时间就会真正等待多少时间.
msleep 是休眠函数,它不涉及忙等待.你如果是 msleep (10),那实际上延迟的时间,大部分时候是要多于 10ms 的,是个不定的时间值.
根据个人经验,10ms 以下的延时对时序要求比较高的地方最好还是用 mdelay,100ms 以上的延时最好还是用 msleep,100ms 以上的延迟
对 linux 的多任务系统运行还是有一定影响

本文介绍了Linux内核中的两类延时函数:忙等和休眠。忙等函数如ndelay、udelay和mdelay提供精确但占用CPU资源的短时间延迟;休眠函数如msleep和ssleep则释放CPU资源,可能导致延迟时间超过预期。在选择延迟函数时,需要根据时序要求和应用场景来决定,例如10ms以下推荐使用mdelay,100ms以上推荐使用msleep。
6273

被折叠的 条评论
为什么被折叠?



