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=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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值