概述:
**********定时器的作用是:当在一个给定的时间到达时,可以来调用一个函数来执行你想完成的任务,优点是,定时器不会阻塞当前进程.
**********定时器是基于时钟滴答的,可以用来完成各种你想要去完成的任务.
**********一个内核定时器,其实是一个数据结构,在该结构内有定时器执行函数,时间一到该函数就会被执行.(在头文件<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);