linux中內核延時函數 (轉)


第一類延時函數原型是:(忙等)

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秒

 

參考文獻:

http://blog.chinaunix.NET/uid-26707720-id-3425774.html

http://www.52rd.com/Blog/Detail_RD.Blog_wangh6620_67531.html

http://blog.csdn.Net/cbk861110/article/details/40747139

 

http://blog.csdn.net/chun_1959/article/details/47333657


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM