天天看點

linux-核心-核心定時器

一.時鐘中斷概念

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);
           

繼續閱讀