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);
Linux的核心延遲函式
當核心需要等待乙個比較短的時間間隔時,比方說 有時候裝置驅動器會等待預先定義的若干個微妙的時間直到硬體完成某些操作。由於動態定時器通常有很大的設定開銷和乙個相當大的最小等待時間 1ms 所以裝置驅動器使用它會很不方便。在這些情況下,核心使用udelay 和ndelay 函式 前者接收乙個微妙級的時間...
Linux核心中的cmpxchg函式
前幾天,為了這個函式花了好多時間,由於參考的資料有誤,一直都沒有看明白,直到google之後,總算搞明白了,因此寫出來大家分享一下。在linux核心中,提供了比較並交換的函式cmpxchg,在include asm i386 cmpxchg.h中,函式的原型是 全選cmpxchg void ptr,...
linux核心中的typecheck函式
最近在檢視linux 時看到了乙個typecheck函式,剛開始不是很明白,具體 如下 define typecheck type,x 這是乙個巨集,它是檢查type和x的資料型別是否一樣,比如我們這樣使用 int a typecheck double,a 巨集展開後是乙個表示式 typeof關鍵字...