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


 时钟中断由系统的定时硬件以周期性的时间间隔来产生,这个间隔由内核根据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定时的驱动程序了。

        

  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值