當核心需要等待乙個比較短的時間間隔時,比方說:有時候裝置驅動器會等待預先定義的若干個微妙的時間直到硬體完成某些操作。由於動態定時器通常有很大的設定開銷和乙個相當大的最小等待時間(1ms),所以裝置驅動器使用它會很不方便。
在這些情況下,核心使用udelay()和ndelay()函式:前者接收乙個微妙級的時間間隔作為它的引數,並在指定的延遲結束後返回;而後者所接收的指定延遲的引數是納秒級的,同樣在指定的延遲結束後返回。
udelay
()和ndelay()這兩個函式定義如下:
void udelay(unsigned long usecs)
void ndelay(unsigned long nsecs)
這兩個函式都是依賴與cur_timer
定時器物件的delay方法,它接收「loops」中的時間間隔作為引數。每一次「loop」精確的持續時間取決於cur_timer涉及的定時器物件。
【如果cur_timer指向time_hpet、time_pmtmr和timer_tsc物件,那麼一次「loop」時間對應乙個cpu迴圈——也就是兩個連續cpu時鐘訊號間的時間間隔。】
【如果cur_timer指向timer_none或timer_pit物件,那麼一次「loop」時間對應一條緊湊指令迴圈在一次單獨的迴圈中所花費的時間。】
始化階段,select_timer()設定好cur_timer後,核心通過執行calibrate_delay()函式來決定乙個節拍裡有多少次「loop」。這個值被儲存在current_cpu_data.loops_per_jiffy變數中,這樣udelay()和ndelay()就能根據它來把微妙和納秒轉換成「loops」。
linux核心中的延遲函式
linux核心提供3個函式分別進行納秒,微妙和毫秒延時 void ndelay unsigned long nsecs void udelay unsigned long usecs void mdelay unsigned long msecs 這3個函式的延時原理是忙等待,也就是說在延時的過程中...
核心延遲操作
核心延遲操作 核心延遲分為長延遲和段延遲,長延時一般以jiffies為單位,短延時則以jiffy為單位,對於不同延遲應該選用不同的實現方法。長延遲一般通過硬體時鐘滴答來實現,對於長延遲,可以使用等待佇列機制 include long wait event timeout wait queue hea...
Linux下的延遲函式sleep
linux下c語言中的延遲函式sleep 的用法 include int main windows下 sleep 1000 代表延遲1秒,因為sleep的引數為毫秒,而在linux下 sleep的引數為秒,所以延遲1秒為 sleep 1 include int main 1秒後 當我們去掉轉義字元 ...