1. 程式人生 > >linux中核心延時函式

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


相關推薦

linux核心函式

第一類延時函式原型是:(忙等) void ndelay(unsigned long nsecs); void udelay(unsigned long usecs); void mdelay(unsigned long msecs); 說明:核心函式 ndelay, ude

Linux kernel 核心函式

其他參考:http://blog.csdn.net/lixiaojie1012/article/details/44229009 當一個裝置驅動需要處理它的硬體的反應時間, 涉及到的延時常常是最多幾個毫秒. 在這個情況下, 依靠時鐘嘀噠顯然不對路. The kerne

Linux Shell函式

在 linux shell 指令碼中經常需要做一些延時處理。 所以經常要用到 sleep 或 usleep 函式。 下面來說一下 sleep 和 usleep 的區別: sleep : 預設以秒為單位。 usleep : 預設以微秒為單位。 1s = 1000ms

stm32函式

//粗延時函式,微秒 void delay_nus(u16 time) {        u16 i=0;      while(time--)    {       i=10;  //自己定義    

在ZSTACK使用函式注意(附機器時鐘指令週期)

關於Z-stack的延時,稍微總結幾點使用中可能需要注意的地方:   1同樣的程式碼,裸機實驗和在Z-stack中延時的時間可能是不一樣的。   因為在Z-stack中可能被中斷打斷,也可能Z-stack在某個地方對時鐘的配置不一樣,建議如果需要比較

linux系統任務及定時任務

size 名稱 查看 裏的 cront all png 文件 星期 1.系統延時任務如遇到這種情況Can‘t open /var/run/atd.pid to signal atd. No atd running?則執行重啟服務 1 at at 固定的時間at now+1m

linux核心 訊號量與自旋鎖、函式比較

       在驅動程式中,當多個執行緒同時訪問相同的資源時(驅動程式中的全域性變數是一種典型的共享資源),可能會引發"競態",因此我們必須對共享資源進行併發控制。Linux核心中解決併發控制的最常用方法是自旋鎖與訊號量(絕大多數時候作為互斥鎖使用)。   自

Linux驅動編寫找不到sleep系列函式的解決辦法

目錄 Linux驅動編寫中找不到sleep系列延時函式的解決辦法 開發環境 問題描述 原因分析 解決辦法 Linux驅動編寫中找不到sleep系列延時函式的解決辦法 開發環境 宿主機:ub

linux 使用者空間 和 核心空間 函式

1s=1000ms=1000000us=1000000000ns=1000000000000ps=1000000000000000fs 核心空間: 核心裡面已經實現了延時函式. #include <linux/delay.h> udelay(int n);  延時n微秒 mdelay(int n)

linux系統任務與定時任務管理

                            延時任務與定時任務的簡單管理         摘要:本文主要介紹了延時命令at的使用方法、限定普通使用者的不正確延時任務、使用者級定時任務的配置、系統級定時任務的配置,最後用臨時檔案生成策略配置的實驗證明了crond.

STM32通過普通函式來精確

在STM32中處處會用到延時函式,一般而言,對於普通的控制延時,並不會要求特別精確,所以可以使用普通的延時函式,例如 void delay(u32 time) { while(time--);

linux應用程式和定時器

筆記:在linux應用程式中延時有sleep()、msleep()和usleep()函式之類的延時,也有如下形式的延時: struct timeval delay; delay.tv_sec = sleepSecond; delay.tv_usec =

DSP兩個函式的區別(轉)

在程式設計的時候可以用CCS自帶的延時函式,在使用時我發現有兩個延時函式都可以用: DELAY_US(1); DSP28x_usDelay(1); 在呼叫DELAY_US(1)這

C++函式

http://blog.csdn.net/keith_bb/article/details/53055380 部落格clock、time函式 http://blog.csdn.net/tangweide/article/details/7063747 _sleep、dela

C\C++計時、函式

C\C++標準庫中提供了兩種計時函式clock()和time()。其用法如下: (1)clock()函式用法 void timeConsume() { double start,stop,durationTime; start = clo

Atmel Studio 6函式錯誤的解決方法

錯誤 __builtin_avr_delay_cycles expects an integer constant.    經過查詢發現是標頭檔案版本更新所致。delay.h檔案214行說明如下: Note: The new implementation of _de

Windows/LinuxC++對於系統函式發生錯誤的除錯方法(除錯Windows/Linux下建立原始socket失敗返回-1)

呼叫系統API時,經常會由於操作不當導致系統函式呼叫發生錯誤,而系統API也是比較友好的,會給你一些特殊的返回值,普遍返回-1,同時,會設定一些變數,表示錯誤型別。在Windows中,呼叫GetLastError,可以得到最近的呼叫失敗的錯誤碼;在Linux中,

unity函式

新建一個工具類 public class DelayToInvoke : MonoBehaviour{ public static IEnumerator DelayToInvokeDo(Action action, float delaySeconds){yield return new Wai

Linux系統的定時任務

########系統的延時任務######## 1.touch /mnt/file{1…9} 在/mnt下建立9個檔案 watch -n 1 ls -l /mnt ##監控mnt下的檔案 2.at time ##延時動作 ctrl+d ##執行這個任務 在圖中的實驗我們可以看到在20.

linux】系統任務及定時任務

1.系統延時任務 1. at命令的使用 at time //設定任務執行時間 rm -fr /mnt/* //任務動作 ctrl+D //發起任務 watch -n 1 ls /mnt開啟一個監控視窗 原本/mnt目錄下有10個檔案