核心定時器

broadviewbj發表於2012-02-27

核心定時器

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

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

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

struct timer_list {

       /*

        * All fields that change during normal runtime grouped to the

        * same cacheline

        */

       struct list_head entry;

       unsigned long expires;

       struct tvec_base *base;

 

       void (*function)(unsigned long);

       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_timerexpires成員指定的時間到期後,該函式將

//被呼叫

//

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(struct device_regs), GFP_KERNEL);

      

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

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

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

       demo_timer.function = &demo_timer_func;

       add_timer(&demo_timer);

      

}

 

//

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

//

static int demo_dev_ release(…)

{

      

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

      

}

核心定時器

——本段文位元組選自《深入Linux裝置驅動程式核心機制》

 圖書詳細資訊:http://space.itpub.net/?uid-13164110-action-viewspace-itemid-716897

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/13164110/viewspace-717233/,如需轉載,請註明出處,否則將追究法律責任。

相關文章