一.時鐘中斷概念
1.時鐘中斷由系統的定時硬體以周期性的時間間隔産生,這個間隔(即頻率)由核心根據hz來确定,hz是一個與體系結構無關的常數,可配置(50-1200),在x86平台上預設值是1000
2.每當時鐘中斷發生的時候,全局變量jiffies(unsigned long)就加1,是以jiffies就記錄了自linux啟動後時鐘中斷發生的次數,驅動程式常常利用jiffies來計算不同僚件間的時間間隔
3.延遲
unsigned long j=jiffies+jit_delay*HZ;
while(jiffies<j){
/*do nothing*/
}//延遲了(1/jit_delay)s
二.核心定時器
1.定時器用于控制某個函數(定時器處理函數)在未來的某個特定時間執行。核心定時器注冊的處理函數隻執行一次–不是循環執行的
雙向連結清單,并用struct timer_list描述一個核心定時器
struct timer_list{
struct list_head entry; //核心使用
unsigned long expires; //逾時的jiffies值–時鐘中斷發生的次數
void(*function)(unsigned long); // 逾時處理函數
unsigned long data; //逾時處理函數的參數
struct tvecbase *base; //核心使用
};
1)初始化時鐘定時器
void init_timer(struct timer_list *timer);
2)啟動定時器
void add_timer(struct timer_list *timer);
3)在定時器逾時前将他删除,當定時器逾時後,系統會自動的删除它
int del_timer(struct timer_list *timer);
三.設定核心定時器的執行個體
timer.c源程式
#include<linux/kernel.h>
#include<linux/module.h>
#include<linux/init.h>
#include<linux/timer.h> //timer
#include<linux/uaccess.h> //jiffies
MODULE_LICENSE("GPL");
MODULE_AUTHOR("FEI");
MODULE_DESCRIPTION("TIMER MODULE");
MODULE_ALIAS("timer module");
struct timer_list timer;
void timer_function(int para){
printk("<0>Timer expried and para is %d\n",para);
}
int timer_init(void){
init_timer(&timer);
timer.data=;
timer.expires=jiffies+(*HZ);
timer.function=timer_function;
add_timer(&timer);
return ;
}
void timer_exit(void){
del_timer(&timer);
}
module_init(timer_init);
module_exit(timer_exit);