Linux 内核开发 - 内核定时器

时间差的度量

系统的定时器硬件以固定的频率产生时钟中断,产生始终中断的间隔以HZ 常量来决定,通常在50~1200之间,x86默认是1000。HZ能够依据不同的内核来配置。
Linux 採用jiffies (unsigned long)来对时钟中断进行计数。每当发生时钟中断时jiffies的值将+1,因此jiffies就记录了系统开机以来的时钟中断总次数。

在驱动开发过程中常常会使用时钟中断来计算不同事件的时间间隔。



延迟运行

对于不精确的时间延迟要求,能够使用while 循环来计算延迟的时间。
//延迟10秒
	unsigned long j = jiffies + 10 * HZ;
	while(jiffies < j)
	{
		// do something.
	}

内核定时器

内核定时器用于控制每一个函数在未来的某个时间点运行。内核定时器被注冊后仅仅能运行一次,假设尚未到达运行目标函数的时间点就删除该定时器。那么目标函数将不能被运行。




内核定时器使用的数据结构(不同内核定时事件以双向链表的形式连接起来):

struct timer_list {
	struct list_head entry; //链表头
	unsigned long expires; //延迟的时间
	struct tvec_base *base;


	void (*function)(unsigned long); //目标函数,定时时间到达时会被调用
	unsigned long data; //目标函数携带的数据
	……
};
  • init_timer(struct timer_list *timer) //初始化timer事件
  • void add_timer(struct timer_list *timer) //加入定时事件
  • int del_timer(struct timer_list *timer) //删除定时事件
范例:
#include <linux/module.h>
#include <linux/init.h>


MODULE_LICENSE("GPL");
MODULE_AUTHOR("Jack Chen");
MODULE_DESCRIPTION("Hello World");
MODULE_ALIAS("A simple module");
MODULE_VERSION("V1.0");


struct timer_list timer;


static void _function(int data)
{
	printk("<3> time is up data:%d\n",data);
}


static int timer_init()
{
	init_timer(&timer);
	timer.expires = jiffies + 5*HZ;
	timer.function = _function;
	timer.data = 10;
	add_timer(&timer);


	return 0;
}


static void timer_exit()
{
	del_timer(&timer);
}


module_init(timer_init);
module_exit(timer_exit);



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值