linux內核提供3個函數分別進行納秒,微妙和毫秒延時:
void ndelay(unsigned long nsecs);
void udelay(unsigned long usecs);
void mdelay(unsigned long msecs);
這3個函數的延時原理是忙等待,也就是說在延時的過程中並沒有放棄cpu,根據cpu的頻率進行一定次數的循環。
在內核中對於毫秒級以上的延時,最好不要直接使用mdelay函數,這將無謂的浪費cpu的資源,對於毫秒級以上的延時,內核提供了下列函數:
void msleep(unsigned int millisecs);
unsigned long msleep_interruptible(unsigned int milosecs);
void ssleep(unsigned int seconds);
注:受系統HZ以及進程調度的影響,msleep類似函數的精度是有限的。
1 長延時
在內核中,一個直觀的延時的方法是將所要延遲的時間設置的當前的jiffies加上要延遲的時間,這樣就可以簡單的通過比較當前的jiffies和設置的時間來判斷延時的時間時候到來。針對此方法,內核中提供了簡單的宏用於判斷延時是否完成。
time_after(jiffies,delay); /*此刻如果還沒有到達延時的時間,則返回真,否則返回0*/
time_before(jiffies,delay);/*如果延時還沒有完成,則返回真,否則返回0*/
下面兩個函數可以將當前進程添加到等待隊列中,從而在等待隊列上睡眠,當超時發生時,進程將被喚醒:
sleep_on_timeout(wait_queue_head_t *q, unsigned long timeout);
interrupt_sleep_on_timeout(wait_queue_head_t *q, unsigned long timeout);