Linux核心的延時函式

2021-08-21 23:58:07 字數 1971 閱讀 7912

第一類延時函式原型是:(忙等) ( 標頭檔案是#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秒

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 使用者空間 和 核心空間 延時函式

2011 06 19 15 28 22人閱讀 收藏舉報 使用者空間 1.unsigned int sleep unsigned int seconds sleep 會使當前程式休眠seconds秒。如果sleep 沒睡飽,它將會返回還需要補眠的時間,否則一般返回零。2.void usleep uns...