Linux核心中的延時函式

2021-10-09 03:45:15 字數 2694 閱讀 9384

第一類延時函式原型是:(忙等) ( 標頭檔案是#include

void ndelay(unsigned long nsecs);

void udelay(unsigned long usecs);

void mdelay(unsigned long msecs);

說明:核心函式 ndelay, udelay, 以及 mdelay 對於短延時好用, 分別延後執行指定的納秒數, 微秒數或者毫秒數. 它們涉及到的延時常常是最多幾個毫秒。

第二類延時函式原型是:(使程序進入休眠)

void msleep(unsigned int millisecs);

unsigned long msleep_interruptible(unsigned int millisecs);

void ssleep(unsigned int seconds)

這類方法獲得毫秒(和更長)延時而不用涉及到忙等待,前2 個函式使呼叫程序進入睡眠給定的毫秒數.

乙個對 msleep 的呼叫是不可中斷的; 你能確保程序睡眠至少給定的毫秒數.

如果你的驅動位於乙個等待佇列並且你想喚醒來打斷睡眠, 使用 msleep_interruptible. 從 msleep_interruptible 的返回值正常地是 0; 如果這個程序被提早喚醒, 返回值是在初始請求睡眠週期中剩餘的毫秒數. 對 ssleep 的呼叫使程序進入乙個不可中斷的睡眠給定的秒數.

區別:

mdelay是忙等待函式,在延遲過程中無法執行其他任務.這個延遲的時間是準確的.是需要等待多少時間就會真正等待多少時間.

msleep是休眠函式,它不涉及忙等待.你如果是msleep(10),那實際上延遲的時間,大部分時候是要多於10ms的,是個不定的時間值.

根據個人經驗,10ms以下的延時對時序要求比較高的地方最好還是用mdelay,100ms以上的延時最好還是用msleep,100ms以上的延遲

對linux的多工系統執行還是有一定影響的。至於10ms到100ms之間的延時看時序的要求情況和應用場景靈活決定了。

在linux driver開發中,經常要用到延遲函式:msleep,mdelay/udelay.

雖然msleep和mdelay都有延遲的作用,但他們是有區別的.

1.)對於模組本身

mdelay是忙等待函式,在延遲過程中無法執行其他任務.這個延遲的時間是準確的.是需要等待多少時間就會真正等待多少時間.

msleep是休眠函式,它不涉及忙等待.你如果是msleep(10),那實際上延遲的時間,大部分時候是要多於10ms的,是個不定的時間值.

2.)對於系統:

mdelay() 會占用cpu資源,導致其他功能此時也無法使用cpu資源。

msleep() 則不會佔住cpu資源,其他模組此時也可以使用cpu資源。

delay函式是忙則等待,占用cpu時間;而sleep函式使呼叫的程序進行休眠。

3.)udelay() mdelay() ndelay() 區別:

udelay(); mdelay(); ndelay();實現的原理本質上都是忙等待,ndelay和mdelay都是通過udelay衍生出來的。

我們使用這些函式的實現往往會碰到編譯器的警告implicit declaration of function 『udelay』,這往往是由於標頭檔案的使用不當造成的。

在include/asm-*/delay.h中定義了udelay(),而在include/linux/delay.h中定義了mdelay和ndelay.

udelay一般適用於乙個比較小的delay,如果你填的數大於2000,系統會認為你這個是乙個錯誤的delay函式,因此如果需要2ms以上的delay需要使用mdelay函式。

4.)msleep,ssleep區別:

休眠單位不同

5.)秒的單位

ms是毫秒=0.001秒

us是微秒=0.000001秒

ns是納秒=0.000000001秒

第一類延時函式原型是:(忙等) ( 標頭檔案是#include

void ndelay(unsigned long nsecs);

void udelay(unsigned long usecs);

void mdelay(unsigned long msecs);

說明:核心函式 ndelay, udelay, 以及 mdelay 對於短延時好用, 分別延後執行指定的納秒數, 微秒數或者毫秒數. 它們涉及到的延時常常是最多幾個毫秒。

第二類延時函式原型是:(使程序進入休眠)

void msleep(unsigned int millisecs);

unsigned long msleep_interruptible(unsigned int millisecs);

void ssleep(unsigned int seconds)

這類方法獲得毫秒(和更長)延時而不用涉及到忙等待,前2 個函式使呼叫程序進入睡眠給定的毫秒數.

乙個對 msleep 的呼叫是不可中斷的; 你能確保程序睡眠至少給定的毫秒數.

如果你的驅動位於乙個等待佇列並且你想喚醒來打斷睡眠, 使用 msleep_interruptible. 從 msleep_interruptible 的返回值正常地是 0; 如果這個程序被提早喚醒, 返回值是在初始請求睡眠週期中剩餘的毫秒數. 對 ssleep 的呼叫使程序進入乙個不可中斷的睡眠給定的秒數.

Linux 核心延時函式

linux核心提供3個函式分別進行納秒,微妙和毫秒延時 void ndelay unsigned long nsecs void udelay unsigned long usecs void mdelay unsigned long msecs 這3個函式的延時原理是忙等待,也就是說在延時的過程中...

Linux核心的延時函式

第一類延時函式原型是 忙等 標頭檔案是 include void ndelay unsigned long nsecs void udelay unsigned long usecs void mdelay unsigned long msecs 說明 核心函式 ndelay,udelay,以及 m...

Linux核心中的cmpxchg函式

前幾天,為了這個函式花了好多時間,由於參考的資料有誤,一直都沒有看明白,直到google之後,總算搞明白了,因此寫出來大家分享一下。在linux核心中,提供了比較並交換的函式cmpxchg,在include asm i386 cmpxchg.h中,函式的原型是 全選cmpxchg void ptr,...