Linux定時器在驅動程式中的應用
核心提供了一組與定時器相關的介面用來簡化管理定時器的操作。所有這些介面都宣告在<linux/Timer.h>中,大多數介面在<kernel/timer.c>中的到實現。
建立定時器首先要先定義它,然後通過一個輔助函式初始化定時器資料結構的內部值,初始化必須在使用其他定時器管理函式之前完成:
#including <linux/Timer.h>
struct timer_list my_timer; //建立定時器
init_timer(&my_timer); // 初始化定時器
my_timer.expires = jiffies + HZ/10; //100ms
my_timer.data = 0; //
my_timer.function = my_function; //my_function自定義的定時器處理函式
add_timer(&my_timer); //最後,啟用定時器
【補充】
也可以這樣呼叫:
1、setup_timer(struct timer_list, function,data); //初始化timer並賦值func和data
2、mod_timer();修改並啟動之。另外,定時值可以這樣設定:msecs_to_jiffies(50);
呼叫方式:
mod_timer(&mytimer, jiffies + msecs_to_jiffies(50) );
注意: 定時器只執行一次,若想週期性的啟動定時器,在my_function()函式中新增mod_timer()函式。
static void my_function(struct work_struct *work) { mod_timer(&button_time,jiffies + HZ/10); }
timer_list結構體如下:
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
};
linux定時器在按鍵中斷驅動中的實際應用可參考:
https://www.cnblogs.com/ape-ming/p/5110996.html