Linux mdelay与msleep的区别以及中断中不能休眠的原因

原创 2013年06月05日 14:11:56

 

在linux driver开发中,经常要用到延迟函数:msleepmdelay

虽然msleepmdelay都有延迟的作用,但他们是有区别的:

mdelay是忙等待函数,在延迟过程中CPU无法运行其他任务。最好用于短时间的延时,否则太浪费CPU资源。

msleep会使当前进程进入休眠状态,CPU可以去执行其他任务。由于msleep涉及到进程调度,延时误差比较大

(进程调度需要耗费时间)。msleep不能用于中断上下文,因为中断函数不能休眠。

至于中断为什么不能进入休眠,今天再网上查阅并总结了一下:

   中断处理的时候,不应该发生进程切换,因为在中断上下文中,唯一能打断当前中断handler的只有更高优先级的中断,

它不会被进程打断(这点对于softirq,tasklet也一样,因此这些bottom half也不能休眠),如果在中断上下文中休眠,

没有办法唤醒它,因为所有的wake_up_xxx都是针对某个进程而言的,而在中断上下文中,没有进程的概念,没有相应的

task_struct(这点对于softirqtasklet一样),因此真的休眠了,比如调用了会导致阻塞的例程,内核几乎肯定会死.

相关文章推荐

关于udelay(); mdelay(); ndelay(); msleep();

在Linux Driver开发中,经常要用到延迟函数:msleep,mdelay/udelay. 虽然msleep和mdelay都有延迟的作用,但他们是有区别的. mdeday还忙等待函数,在延迟...
  • scottgly
  • scottgly
  • 2011年10月06日 14:03
  • 20754

udelay、mdelay、ndelay、msleep使用比较说明

时间单位:     毫秒(ms)、微秒 (μs)、纳秒(ns)、皮秒(ps)、飞秒(fs)、阿秒、渺秒     1 s = 10^3 ms = 10^6 us = 10^9 ns = 10^12 ...

Linux时间子系统之七:定时器的应用--msleep(),hrtimer_nanosleep()

我们已经在前面几章介绍了低分辨率定时器和高精度定时器的实现原理,内核为了方便其它子系统,在时间子系统中提供了一些用于延时或调度的API,例如msleep,hrtimer_nanosleep等等,这些A...

Linux时间子系统之七:定时器的应用--msleep(),hrtimer_nanosleep()

我们已经在前面几章介绍了低分辨率定时器和高精度定时器的实现原理,内核为了方便其它子系统,在时间子系统中提供了一些用于延时或调度的API,例如msleep,hrtimer_nanosleep等等,这些A...

Linux时间子系统之七:定时器的应用--msleep(),hrtimer_nanosleep()

我们已经在前面几章介绍了低分辨率定时器和高精度定时器的实现原理,内核为了方便其它子系统,在时间子系统中提供了一些用于延时或调度的API,例如msleep,hrtimer_nanosleep等等,这些A...

再思linux内核在中断路径内不能睡眠/调度的原因(2010)

Linux内核中断路径中不能睡眠,为什么?   这里就行了很深入的讨论,值得一看:http://bbs2.chinaunix.net/viewthread.php?tid=1618430   ...

再思linux内核在中断路径内不能睡眠/调度的原因(2010)

版权声明:本文为博主原创文章,未经博主允许不得转载。 Linux内核中断路径中不能睡眠,为什么?   这里就行了很深入的讨论,值得一看:http://bbs2.chinaunix.net...

关于LINUX在中断(硬软)中不能睡眠的原因

http://bbs.chinaunix.net/thread-2115820-2-1.html 我们都是从理论讲下面这些问题, 因为linux在很多地方做了保护, 所以直接sleep或者sch...
  • fzs333
  • fzs333
  • 2015年12月28日 13:50
  • 494
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux mdelay与msleep的区别以及中断中不能休眠的原因
举报原因:
原因补充:

(最多只允许输入30个字)