linux-内核-内核定时器

来源:互联网 发布:U8索引超出数组界限 编辑:程序博客网 时间:2024/04/29 08:01

一.时钟中断概念
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> //jiffiesMODULE_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=5;timer.expires=jiffies+(20*HZ);timer.function=timer_function;add_timer(&timer);return 0;}void timer_exit(void){del_timer(&timer);}module_init(timer_init);module_exit(timer_exit);
原创粉丝点击