内核定时机制API之usleep_range

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的效率高,因此推荐使用.

你可能感兴趣的:(Linux,源码分析,kernel常用API源码分析)