參考閱讀:
* Linux- 關於timer定時器, delay延遲, sleep睡眠, 與中斷….等等
在內核中如果想週期性的幹些什麼事情,或者某個特定時間幹些什麼事情,可以使用定時器 timer。
例如像週期性地轉儲某段緩衝的數據等等。先來看看使用方法。
先定義一個struct timer_list的對象:
eg:
1 |
struct timer_list dump_t; |
這個對象相當於一個鬧鐘,其中包含了時間點,也就是什麼時候激活鬧鐘;一個函數指針,鬧鐘激活後幹活的地方;還有一個空指指針,在鬧鐘幹活的時候可能需要傳給它一些當前的數據。
初始化 init_timer(), 以及如何申請一個定時器:
前面看了使用方法,這裡再稍微深入了解一下。
前面定義好了struct timer_list對象,接下來就需要初始化該對象。調用函數init_timer進行初步初始化。
接著, 對結構體中的一些成員進行賦值:
1 2 3 4 |
init_timer(&dump_t); // Step 1.初始化 dump_t.function = dump_function; // Step 2.綁定到時候要調的函數(timer任務具體的事務) dump_t.data =(unsigned long)my_dev; dump_t.expires = jiffies + 2 * HZ; //Step 3.設置計時器任務激活時間,2秒鐘之後計時器被激活,如果是n秒,將2 * HZ改為n * HZ。 |
這樣就OK了麼?
當然沒有,需要把定時器加到定時器列表中,也就是要告訴系統,你申請了這麼一個定時器。
1 |
add_timer(&dump_t); //Step 4.告訴系統,你申請了這麼一個計時器。 |
主要工作的函式, 以及如何重新啟動計時器?
現在不明白的地方就是計時器到了,幹活的地方,即dump_function函數。
函數聲明:
static void dump_function(unsigned long channel);
其中的實現就根據需求各自撰寫程式碼了,看你想讓這個計時器幹些什麼活。
注意一點,這個計時器只會響應一次,因為jiffies + HZ時間點只有一個。
如果想讓此定時器週期性地幹活,就需要在dump_function函數中重新啟動該計時器。
啟動方法:
1 2 3 4 5 6 7 8 9 10 |
dump_function() { do_your_task(); del_timer(&dump_t); dump_t.function = dump_function; dump_t.data =(unsigned long)mydev; dump_t.expires = jiffies + 2 * HZ; add_timer(&dump_t); } |