首页 > 其他 > 详细

timer-----内核定时器

时间:2014-01-25 09:52:07      阅读:374      评论:0      收藏:0      [点我收藏+]

概述:

**********定时器的作用是:当在一个给定的时间到达时,可以来调用一个函数来执行你想完成的任务,优点是,定时器不会阻塞当前进程.

**********定时器是基于时钟滴答的,可以用来完成各种你想要去完成的任务.

**********一个内核定时器,其实是一个数据结构,在该结构内有定时器执行函数,时间一到该函数就会被执行.(在头文件<linux/timer.h>中)

定时器结构(主要关注三个成员)

struct timer_list {
	struct list_head entry;
	unsigned long expires;			//表示定时器期望运行定时器函数的jiffies值

	void (*function)(unsigned long);	//定时器执行函数
	unsigned long data;			//传递给内核执行函数的参数

	struct tvec_base *base;
#ifdef CONFIG_TIMER_STATS
	void *start_site;
	char start_comm[16];
	int start_pid;
#endif
};
**********定时器运行时和调用该定时器的进程不在同一个进程上下文中,也就是说它俩没有任何关系了,谁也影响不到谁.

**********定时器运行时,调用定时器的进程可能处的状态是:可能在睡眠,可能在一个不同的处理器上运行,可能已经退出.

**********定时器函数的执行必须是原子操作不能被打断.

**********定时器函数的运行是在调用该定时器进程的进程上下文之外运行的

**********在进程上下文之外,有一下限制条件

1.    不允许存取用户空间,因为没有进程上下文,没有和任何特定进程相关联的到用户空间的途径

2.    该进程的current指针在原子态没有意义,并且current不能使用,因为相关的代码没有和已被中断的进程有联系

3.    在进程上下文之外也不能进行睡眠或者调度.

**********内核可以通过调用in_interrupt()宏函数(包含在头文件<asm/hardirq.h>)来判断某一执行动作是否在进程上下文中,如果处理器在当前中断上下文中运行就返回0.

内核定时器的使用步骤:
**********第一步:定义和初始化定时器

struct  timer_list tl
{
        .expires = ,	//具体值自己设定
        .function = ,
        .data = ,
};

void init_timer(struct timer_list *timer);	//初始化定时器结构体的函数

struct timer_list TIMER_INITIALIZER(_function, _expires, _data);
**********第二步:启动定时器

void add_timer(struct timer_list * timer);
**********删除定时器(这个可以在定时器没到时,用来取消定时,)

int del_timer(struct timer_list * timer);

和内核定时器有关的函数:

//修改一个定时器的超时时间
int mod_timer(struct timer_list *timer, unsigned long expires);
//删除一个定时器,并且确保在该函数返回时,定时器执行函数不在任何CPU上运行.
int del_timer_sync(struct timer_list *timer);
//判断定时器是否在调度运行,返回值:1表示在运行,0表示没有
int timer_pending(const struct timer_list * timer);


































































timer-----内核定时器

原文:http://blog.csdn.net/wzc18743083828/article/details/18728877

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!