1、有时候为了同步CPU与外设的速度问题,带来了延时操作。
延时可以分为长延时和断延时。
2、长延时
a、忙等待
while(i--)
优点:简单
缺点:i、忙等待,CPU效率低
ii、内核允许抢占时,时间不精确
b、让出处理器
i、unsigned long j = jiffies + HZ;
while(time_before(jiffies,j))
schedule()
schedule()可以让出处理器,但不能把进程从CPU的运行队列中移出。当只有这一个进程时,将导致CPU不断的运行schedule而不能进入idle状态。
ii、delay_1s()
{
set_current_state(TASK_UNINTERRUPTIBLE);
schedule_timeout(jiffies + HZ);
}
改变当前进程的状态,调用schedule_timeout时可以把进程睡眠。
schedule_timeout,当前进程从运行队列移走之后将被纪录到定时器的数据节点中,当定时器的时间到期后,将会唤醒进程从新进入运行队列。
iii、msleep
void msleep(unsigned int msecs):内部实现了__set_current_state和schedule_timeout。
msleep_interruptible
unsigned long msleep_interruptible(unsigned int msecs):睡眠的进程可以被打断。
3、短延时
短延时一般延时时间较短,可与进程切换所需时间比拟。所以短延时的实现一般基于忙等待。
进程切换一板1-100微秒。
include/linux/delay.h
void mdelay(unsigned long msecs);
void udelay(unsigned long usecs);
void ndelay(unsigned long nsecs);