您的位置:首页 > 运维架构 > Linux

linux内核定时器--------一个简单的timer的实现

2012-03-06 11:17 274 查看
 时钟中断由系统的定时硬件以周期性的时间间隔来产生,这个间隔由内核根据HZ来确定,HZ是一个与体系结构无关的常熟,可配置在(50-----200),x86上默认的1000(每秒产生1000次中断)。

 当时钟中断时,全局变量jiffies就加1,jiffiies则计算出产生了多少次的中断。如:

unsigned long j = jiffies + jit_delay*HZ
while(jiffies < j)
{
do something;
}

这就是一个延迟的内核程序了。

定时器用于控制某个函数在某个特定的时间执行,内核定时器注册的处理函数,只能执行一次。

内核定时器被组织成双向的链表,用struct timer_list 结构来描述秒个定时器。struvt timer_list 结构体如下:

       

struct timer_list{
struct list_head entry /*内核使用*/
unsigned list_head expire /超时的jiffies 的值*/
void (*function)(unsigned log)/*超时的处理函数*/
unsigned long data/*超时处理函数的参数*/
struct tvec_base *base  /*内核使用*/}

           操作定时器的函数通常有以下几个:

     void init_timer(struct timer_list *timer)  定时器的初始化

     void add_timer(struct timer_list *timer)  启动定时器

     void del_time(struct timer_list *timer)  在定时超时之前删除它。但定时器超时后,内核自动会删除它。

来看个例:

           

#include<linux/kernel.h>
#include<linux/module.h>
#include<linux/init.h>
#include<linux/timer.h>/*timer*/
#include<asm/uaccess.h>/*expires*/

MODULE_LISENCE("GPL");
MODULE_AUTHOR("KK");
MODULE_DESCRIPTION("TIME MODULES");
MODULE_ALIAS("time modules");

struct timer_list timer;
void timer_function(int para)
{
prink("<0>timer is expires and the para is %d\n",para);
}
timer_init()
{
timer_init(&timer);
timer.data= 5;
time.expires = jiffies + (20*jiffies);
timer_function = timer_function;
add_timer(&timer);
return 0;
}
timer_exit()
{
del_timer(&timer);
}
module_init(timer_init);
module_exit(timer_exit);

加入内核进行编译,再传到开发板上,innsmod timer.ko 20秒后加入不rmmod  timer.ko 的话则会有超时的提醒。

这就是一个最简单的一个timer定时的驱动程序了。

        

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息