核心定時器

2021-08-26 17:32:10 字數 2272 閱讀 3830

核心定時器

核心定時器是裝置驅動程式中經常要用到的另乙個重要的核心設施。如果驅動程式希望在將來某個可度量的時間點到期後,由核心安排執行某項任務(此處的任務通常是驅動程式自身定義的某個函式,接下來的敘述中稱之為定時器函式),便可以使用定時器來完成。

裝置驅動程式中對核心定時器的乙個典型使用場景是用它來實現輪詢機制,因為定時器函式自身可以重新啟用它所在的定時器,所以在乙個時間段到期後,定時器函式被呼叫,在函式內部因為又重新啟用了該定時器,這樣便形成了乙個不斷迴圈的定時器函式被系統呼叫的模式。此種情形下,如果裝置驅動程式需要周期性地檢查裝置的某種操作狀態,便可以在定時器函式中來完成。

驅動程式等核心模組如果要使用定時器,首先應該定義乙個定時器型別的變數。struct timer_list是核心提供的乙個用來表示定時器的資料結構,其定義如下(刪去了一些用於除錯及統計資訊的成員):

struct timer_list {

* all fields that change during normal runtimegrouped to the

* same cacheline

struct list_head entry;

unsigned long expires;

struct tvec_base *base;

void (*function)(unsignedlong);

unsigned long data;

int slack;

其中在驅動程式中常用的是以下三個成員:

unsigned long expires

指定定時器的到期時間。

void (*function)(unsigned long)

定時器函式。當expires中指定的時間到期時,該函式將被觸發。

unsigned long data

定時器物件中攜帶的資料。通常的用途是,當定時器函式被呼叫時,核心將把該成員作為實際引數傳遞給定時器函式。之所以要這樣做,是因為定時器函式將在中斷上下文中執行,而非當前程序的位址空間中。

其他的一些成員將主要由核心使用,用以實現定時器的核心機制,在後面會看到這些成員的用法。

為了讓讀者對驅動程式使用核心定時器有個直觀的印象,接下來將先給出一段示例**,然後再對其中一些關鍵函式的使用及其核心實現機制進行分節討論。下面的**展示了乙個裝置驅動程式通過使用核心定時器來輪詢裝置狀態。

struct device_regs *devreg = null; //定義乙個用於表示裝置暫存器的結構體指標

struct timer_list demo_timer; //定義乙個核心定時器物件

//定義定時器函式,當定時器物件demo_timer中expires成員指定的時間到期後,該函式將

//被呼叫

static void demo_timer_func (unsigned long data)

//在定時器函式中重新啟動定時器以實現輪詢的目的

demo_timer.expires = jiffies +hz;

add_timer(&demo_timer);

//定時器函式將data引數通過型別轉換獲得裝置暫存器的結構體指標

struct device_regs *preg =(struct device_regs *) data;

//定時器函式此後將會讀取裝置狀態

//用於開啟裝置的函式實現

static int demo_dev_open(…)

//分配裝置暫存器結構體的指標變數,最好放在模組初始化函式中…

devreg = kmalloc(sizeof(structdevice_regs), gfp_kernel);

init_timer(&demo_timer); //呼叫核心函式init_timer來初始化定時器物件demo_timer

demo_timer.expires = jiffies +hz; //設定定時器到期時間點,從現在開始的1秒鐘

demo_timer.data = (unsignedlong) devreg; //將裝置暫存器指標位址作為引數

demo_timer.function =&demo_timer_func;

add_timer(&demo_timer);

//用於關閉裝置的函式實現

static int demo_dev_ release(…)

del_timer_sync(&demo_timer);//刪除定時器物件

——本段文字節選自《深入linux裝置驅動程式核心機制》

圖書詳細資訊:

核心定時器

linux核心2.4版中去掉了老版本核心中的靜態定時器機制,而只留下動態定時器。相應地在timer bh 函式中也不再通過 run old timers 函式來執行老式的靜態定時器。動態定時器與靜態定時器這二個概念是相對於linux核心定時器機制的可擴充套件 功能而言的,動態定時器是指核心的定時器佇...

核心定時器

核心中最終的計時資源是定時器。定時器用於定時器超時處理程式在未來某個特定時間點執行,或者週期性的輪詢硬體的狀態。linux提供了核心定時器完成這類工作。定 時器的只需要執行一些初始化的操作,如 設定乙個超時時間,指定超時要呼叫的函式,然後啟用定時器就可以了。它的處理和工作佇列還是有點類似的。和任務隊...

核心定時器,

ldd3 當定時器執行時 排程該定時器的程序可能正在睡眠,或在其它處理器上執行,或乾脆推出。沒有執行定時器,排程它的程式推出了,定時器該如何?2.6.35。22核心 gcc 4.4.5 include include include include include include include i...