定时器timer应用

定时器是管理内核所花时间的基础,利用它可以实现在未来某个时间,触发一个事件。它的使用比较简单,只需要执行一些初始化工作,设置一个时间期限,指定到时候执行的函数,然后激活计时器就可以了,指定的函数将在定时器到期后自动执行。定时器不是周期运行的,它在到期后就自行销毁。

定时器timer_list结构定义:

struct timer_list {

	struct list_head entry;//定时器组织链表
	unsigned long expires;//以节拍位单位的倒计时
	struct tvec_base *base;

	void (*function)(unsigned long);//定时器到了要执行的函数(回调函数)
	unsigned long data;//回调函数参数的值

	int slack;//定时器可延迟时间
	...;
}

定时器的初始化

init_timer(&timer);
timer.expires=expire;
timer.data=(unsigned long)current;
timer.function=my_process_time;

激活定时器

add_timer(&timer);

停止定时器

del_timer(&timer);

《Linux操作系统原理与应用》P158定时器应用例子调试代码

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/timer.h>
#include <asm/param.h>
#include <linux/sched.h>

MODULE_LICENSE("GPL");

long timeout=2*HZ;
long remaining;

static void my_process_time(unsigned long data)
{
	struct tast_struct *p=(struct task_struct *)data;
	wake_up_process(p);
	printk(KERN_ALERT"p is waked up\n");
}
static long my_schedule_timeout(long timeout)
{
	struct timer_list timer;
	unsigned long expire;

	expire=timeout+jiffies;
	init_timer(&timer);
	timer.expires=expire;
	timer.data=(unsigned long)current;
	timer.function=my_process_time;

	add_timer(&timer);
	schedule();
	del_timer(&timer);
	printk(KERN_ALERT"ex %lu jf %lu\n",expire,jiffies);
	timeout=expire-jiffies;

	printk(KERN_ALERT"schedule_time  %d\n",timeout);

	return (timeout<0?0:timeout);
}
static int __init timer_init(void)
{
	printk(KERN_ALERT"timer init\n");
	set_current_state(TASK_INTERRUPTIBLE);
	remaining=my_schedule_timeout(timeout);
	printk(KERN_ALERT"remianing is %d\n",remaining);

	return 0;
}
static void __exit timer_exit(void)
{
	printk(KERN_ALERT"timer exit\n");
}

module_init(timer_init);
module_exit(timer_exit);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值