linux之延時及核心定時器的使用

2021-07-25 15:14:56 字數 2202 閱讀 8413

標籤: linux

timer

include

list

function

任務

2012-03-20 17:38

1001人閱讀收藏

舉報

linux(32)

作者同類文章x

想要在核心中的實行短的延時我們可以看這兩個標頭檔案linux-3.0.1\include\linux

下的delay.h

和linux-3.0.1\arch\arm\include\asm

下的delay.h

裡面包含了這樣幾句延時的語句

void ndelay(unsigned long nsecs); //納秒級的延時

void udelay(unsigned long usecs); //微妙級的延時

void mdelay(unsigned long msecs); //毫秒級的延時

用這三個函式我們要重點知道他們是忙等待函式,因此在延時的同時其它程式是無法執行的,如果涉及到毫秒級以上的延時我個人不推薦使用mdelay

因為對於處理器來說毫秒是乙個很長的時間,在這之中它可以做很多的事情,因此我們可以使用一下的函式來替換這個函式:

void msleep(unsigned int millsecs); //毫秒級睡眠

unsigned long msleep_interruptible(unsigned int millsecs); //毫秒級帶有中斷喚醒的延時

(通常返回值為

0,但是如果提前被喚醒則返回剩餘毫秒數)

void ssleep(unsigned int seconds)  //秒級的延時

個人認為這些延時過程當中系統在進行任務的排程,當延時時間到達時,核心在直接排程這個程序。 

核心定時器是基於滴答時鐘實現定時,如果我們需要在將來的某乙個時刻讓核心排程執行某段程式,同時在這個時刻到來之前不會阻塞當前程序。

核心定時器的使用只有3

個步驟

1.定義定時器結構體

struct timer_list {

struct list_head entry; //定時器列表

unsigned long expires; //定時器到期時間

struct tvec_base *base;

void (*function)(unsigned long); //定時器中斷處理函式

unsigned long data; //作為引數可以傳入定時器中斷處理函式

2.給定時器結構體賦定時時間、定時中斷處理函式、傳參設定。

在這裡我講一下定時的數值該怎麼來確定,因為核心定時器是基於jiffies

,所以設定的時間要在

jiffies

之上加上我們的定時值,比如定時

2秒則:

2*hz

,看到這個

hz可能會蒙,其實很好理解,在

linux-3.0.1\arch\arm\include\asm

下的param.h

標頭檔案中已經給出,就是每秒中

jiffies

這個計數器會計多少值。

3.啟用定時器add_timer;

對於上面的第2

步,涉及到靜態定義和動態定義兩種方法

靜態定義struct timer_list timer_initializer(_function, _expires, _data);

直接把中斷函式,到期時間,傳入引數寫上即可。

動態定義,就是我們一般的對結構體賦值,非常簡單。不過在賦值之前我們先必須初始化timer_list這個結構體,

如init_timer(&

結構體名);

完成以上步驟之後我們就可以呼叫add_timer

函式來啟用定時器開始定時。

當我們啟用定時器後,它只會執行一次處理函式,然後將定時器從核心中移除。但我們平時往往需要重複執行,所以核心給我嗎提供了int mod_timer(struct timer_list *timer, unsigned long expires)。

在不用定時器的時候我們需要int del_timer(struct timer_list *timer)

需要刪除定時器。

程序來接管了這個定時器,當定時器時間一到。核心將呼叫

程序執行函式。

頂 0

踩 0

我的同類文章

linux(32)

核心定時器和延時

核心在時鐘中斷發生後檢測各定時器是否到期,在linux核心中提供了一組函式和資料結構來完成定時觸發工作 週期的事務。struct timer list expires,定時器的到期時間,單位是jiffies function,定時器到期,要執行的函式 data,傳入要執行的函式的引數 1.void ...

linux核心中如何使用定時器延時

0.包含標頭檔案 include 1.定義時間結構體變數 static struct timer list kbd timer 2.初始化時間結構體變數 init timer kbd timer 3.指定定時器超時服務函式 void kbd timer handler unsigned long k...

linux 核心 核心定時器

一.時鐘中斷概念 1.時鐘中斷由系統的定時硬體以週期性的時間間隔產生,這個間隔 即頻率 由核心根據hz來確定,hz是乙個與體系結構無關的常數,可配置 50 1200 在x86平台上預設值是1000 2.每當時鐘中斷發生的時候,全域性變數jiffies unsigned long 就加1,所以jiff...