核心延遲函式分析,區分delay和sleep

2021-06-21 21:54:53 字數 954 閱讀 6943

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);

Mootools中delay這個延遲函式的高階用法

這是一種最簡單的用法 function delay 1000 這個函式會在1秒之後自動被執行 我們看一下delay這個函式的實現方法 delay function delay,bind,args 很顯然,它是使用了settimeout來實現的,那麼既然如此我們就可以清理他,下邊是實現方法 var f...

Mootools中delay這個延遲函式的高階用法

這是一種最簡單的用法 function delay 1000 這個函式會在1秒之後自動被執行 我們看一下delay這個函式的實現方法 delay function delay,bind,args 很顯然,它是使用了settimeout來實現的,那麼既然如此我們就可以清理他,下邊是實現方法 var f...

SysTick定時器和delay延遲函式

1,systick clksourceconfig 分析 在fwlib misc.c中找到systick clksourceconfig 函式原始碼 void systick clksourceconfig uint32 t systick clksource else 功能 配置systick c...