參考資料:
《正點原子Linux驅動教程》
定時器是一個很常用的功能,需要週期性處理的工作都要用到定時器。Linux 核心定時器採用系統時鐘來實現,也就是arch timer。Linux 核心使用 timer_list 結構體表示核心定時器,timer_list 定義在檔案
include/linux/timer.h 中,定義如下:
struct timer_list { struct list_head entry; unsigned long expires; /* 定時器超時時間,單位是節拍數 */ struct tvec_base *base; void (*function)(unsigned long); /* 定時處理函式 */ unsigned long data; /* 要傳遞給 function 函式的引數 */ int slack; };
要使用核心定時器首先要先定義一個 timer_list 變數,表示定時器,tiemr_list 結構體的expires 成員變數表示超時時間,單位為節拍數。比如需要定義一個週期為 2 秒的定時器,那麼這個定時器的超時時間就是 jiffies+(2*HZ),因此 expires=jiffies+(2*HZ)。function 就是定時器超時以後的定時處理函式,我們要做的工作就放到這個函式里面,需要我們編寫這個定時處理函式。
timer_list的系列API:
void init_timer(struct timer_list *timer) // 初始化timer_list型別變數 void add_timer(struct timer_list *timer) // 向Linux核心註冊定時器 int del_timer(struct timer_list * timer) // 用於刪除一個定時器 int mod_timer(struct timer_list *timer, unsigned long expires) // 用於修改定時值
測試demo:
#include <linux/module.h> #include <linux/kernel.h> #include <linux/timer.h> static struct timer_list my_timer; static void my_timer_callback(struct timer_list *t) { printk("Timer callback function is called!\n"); // 在這裡可以執行定時器觸發時需要進行的操作 } static int __init timer_demo_init(void) { printk("Initializing timer demo\n"); // 初始化定時器 timer_setup(&my_timer, my_timer_callback, 0); // 設定定時器觸發時間為當前時間後的5秒 mod_timer(&my_timer, jiffies + msecs_to_jiffies(5000)); return 0; } static void __exit timer_demo_exit(void) { del_timer(&my_timer); printk("Exiting timer demo\n"); } module_init(timer_demo_init); module_exit(timer_demo_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("lethe1203"); MODULE_DESCRIPTION("timer demo");