usleep_range 用于非原子环境的睡眠,目前内核建议用这个函数替换之前udelay。
其源码分析如下:
void __sched usleep_range(unsigned long min, unsigned long max)
{
#得到最早wakeup的时间
ktime_t exp = ktime_add_us(ktime_get(), min);
#计算必须要在max-min这个时间段wakeup,然后将这个时间转成nsec
u64 delta = (u64)(max - min) * NSEC_PER_USEC;
for (;;) {
#设置进程不可被中断,也就是不能被中断和信号量唤醒
__set_current_state(TASK_UNINTERRUPTIBLE);
/* Do not return before the requested sleep time has elapsed */
#调用schedule让出cpu,这里也可以看出定时使用hrtimeout这个高精度时钟,
if (!schedule_hrtimeout_range(&exp, delta, HRTIMER_MODE_ABS))
break;
}
}
这个函数最早会在形参min时间醒来,最晚会在max这个时间醒来。这个函数不是让cpu忙等待,而是让出cpu
让其他进程使用,因此使用这个函数比udelay的效率高,因此推荐使用.
内核定时机制API之usleep_range
最新推荐文章于 2024-07-01 11:29:28 发布