Linux 內核開發 - 內核定時器
來源:程序員人生 發布時間:2014-09-09 03:46:48 閱讀次數:2804次
時間差的度量
系統的定時器硬件以固定的頻率產生時鐘中斷,產生始終中斷的間隔以HZ 常量來決定,通常在50~1200之間,x86默認是1000,HZ可以根據不同的內核來配置。
Linux 采用jiffies (unsigned long)來對時鐘中斷進行計數,每當發生時鐘中斷時jiffies的值將+1,因此jiffies就記錄了系統開機以來的時鐘中斷總次數。在驅動開發過程中經常會使用時鐘中斷來計算不同事件的時間間隔。
延遲執行
對于不精確的時間延遲要求,可以使用while 循環來計算延遲的時間。
//延遲10秒
unsigned long j = jiffies + 10 * HZ;
while(jiffies < j)
{
// do something.
}
內核定時器
內核定時器用于控制每個函數在未來的某個時間點執行。內核定時器被注冊后只能執行一次,如果尚未到達執行目標函數的時間點就刪除該定時器,那么目標函數將不能被執行。
內核定時器使用的數據結構(不同內核定時事件以雙向鏈表的形式連接起來):
struct timer_list {
struct list_head entry; //鏈表頭
unsigned long expires; //延遲的時間
struct tvec_base *base;
void (*function)(unsigned long); //目標函數,定時時間到達時會被調用
unsigned long data; //目標函數攜帶的數據
……
};
- init_timer(struct timer_list *timer) //初始化timer事件
- void add_timer(struct timer_list *timer) //添加定時事件
- int del_timer(struct timer_list *timer) //刪除定時事件
范例:
#include <linux/module.h>
#include <linux/init.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Jack Chen");
MODULE_DESCRIPTION("Hello World");
MODULE_ALIAS("A simple module");
MODULE_VERSION("V1.0");
struct timer_list timer;
static void _function(int data)
{
printk("<3> time is up data:%d
",data);
}
static int timer_init()
{
init_timer(&timer);
timer.expires = jiffies + 5*HZ;
timer.function = _function;
timer.data = 10;
add_timer(&timer);
return 0;
}
static void timer_exit()
{
del_timer(&timer);
}
module_init(timer_init);
module_exit(timer_exit);
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈