1. 程式人生 > >Linux核心定時器-- timer_list

Linux核心定時器-- timer_list

一.概述

      核心經常要推後執行某些程式碼,如底半部機制就是為了將工作推後執行。timer_list為我們提供一種方式,使工作能夠在指定時間點上執行。

      定時器使用簡單,只須執行一些初始化工作,設定一個超時時間,指定超時發生後執行的函式,然後啟用定時器就可以了。

      定時器並不是週期執行的,它在超時後就自行銷燬,這就是這種定時器被稱為動態定時器的原因。動態定時器不斷地建立和銷燬,而且它的執行次數也不受限制。

二.標頭檔案

linux/timer.h

三.結構體資料型別

struct timer_list {
     struct list_head entry; //定時器連結串列的入口
     unsigned long expires; //定時器超時時的節拍數
     void (*function)(unsigned long ); //定時器處理函式
     unsigned long data; //傳給定時器處理函式的長整型引數
     struct tvec_t_base_s *base; //定時器內部值,使用者不要使用
#ifdef CONFIG_TIMER_STATS
     void *start_site;
     char start_comm[16];
     int start_pid;
#endif
}; 

四.函式介面

①主要相關的API函式

init_timer(struct timer_list*):定時器初始化函式;
add_timer(struct timer_list*):往系統新增定時器;
mod_timer(struct timer_list *, unsigned long jiffier_timerout):修改定時器的超時時間為jiffies_timerout;
timer_pending(struct timer_list *):定時器狀態查詢,如果在系統的定時器列表中則返回1,否則返回0;
del_timer(struct timer_list*):刪除定時器

②初始化

 struct timer_list my_timer;  
  init_timer(&my_timer);// 初始化定時器  
  my_timer.expires = jiffies + delay; //  
  my_timer.data = 0; //  
  my_timer.function = my_function; //  
  add_timer(&my_timer); //最後,啟用定時器
                                       

五.使用方法

       使用的一般步驟為:

              如果要完成周期性的重複工作,只要在初始化的基礎上,在超時函式my_function內部加上以下程式碼,重新更新引數

  my_timer.expires = jiffies + delay; //  
  my_timer.data = 0; //  
  my_timer.function = my_function; //  
  add_timer(&my_timer); //啟用定時器
             這樣就能實現週期執行my_function函數了