您的位置:首页 > 其它

内核定时器

2014-01-21 15:26 197 查看
     1.一个内核定时器是一个数据结构,
它指导内核执行一个用户定义的函数使用一个用户定义的参数在一个用户定义的时间. 这个实现位于<linux/timer.h>和kernel/timer.c
     2.实际上,
内核定时器被作为一个"软件中断"的结果而实现.
     3.内核提供给驱动许多函数来声明,
注册, 以及去除内核定时器

使用内核定时器的步骤:
    1)定义内核定时器

      定义一个名为mytimer的定时器

      struct 
timer_list mytimer;

定义内核定时器timer_list,在linux内核中,timer_list结构体的一个实例对应一个定时器
#include<linux/timer.h>
struct
timer_list
{

unsigned
long expires;
void
(*function)(unsigned long);
unsigned
long data;
};
这个
expires 字段表示定时器期望运行的 jiffies 值; 在那个时间, 这个 function 函数被调用使用 data作为一个参数.这个结构必须在使用前初始化.
2)初始化定时器

 

  init_timer(&mytimer);

   mytimer.function=my_functiong;

  mytimer.expires=jiffies+HZ;

void
init_timer(struct timer_list *timer);
init_timer()函数初始化timer_list的entry的next为NULL,并给base指针赋值
3)向内核添加(注册)定时器

    add_timer(&mytimer);
void
add_timer(struct timer_list * timer);
注册内核定时器,将定时器加入到内核动态定时器链表中
4)删除定时器

   del_timer(&mytimer);
int
del_timer(struct timer_list *timer);
删除定时器,del_timer_sync()是del_timer()同步版,在删除一个定时器时需等待其被处理完,该函数的调用不能发生在中断上下文。

 

该设置后内核定时器将只执行一次,当超时后会被内核调用一次。要想循环定时可以在触发函数中设置mod_timer(&mytimer,jiffies+HZ);

5)修改定时器expire
int
mod_timer(struct timer_list *timer,unsigned longexpires);
更新一个定时器的超时时间,
使用一个超时定时器的一个普通的任务(再一次, 关马达软驱定时器是一个典型例子). mod_timer也可被调用于非激活定时器, 那里你正常地使用 add_timer.
------------------------------------------------------------------------------

------------------------------------------------------------------------------
1.一个
tasket, 就象一个内核定时器, 在一个"软中断"的上下文中执行(以原子模式),在使能硬件中断时执行异步任务的一个内核机制.
2.一个
tasklet 存在为一个时间结构, 它必须在使用前被初始化.初始化能够通过调用一个特定函数或者通过使用某些宏定义声明结构:
#include<linux/interrupt.h>
struct
tasklet_struct {

void
(*func)(unsigned long);
unsigned
long data;
};
void
tasklet_init(struct tasklet_struct *t,
void
(*func)(unsigned long), unsigned long data);
DECLARE_TASKLET(name,
func, data);
DECLARE_TASKLET_DISABLED(name,
func, data);
3.tasklet的特点
1)一个
tasklet 能够被禁止并且之后被重新使能;它不会执行直到它被使能与被禁止相同的的次数.
2)如同定时器,
一个 tasklet 可以注册它自己
3)一个
tasklet 能被调度来执行以正常的优先级或者高优先级
4)taslet
可能立刻运行, 如果系统不在重载下, 但是从不会晚于下一个时钟嘀哒
5)一个
tasklet 可能和其他 tasklet 并发, 但是对它自己是严格地串行的
3.禁止给定的
tasklet
void
tasklet_disable(struct tasklet_struct *t);
这个函数禁止给定的
tasklet. tasklet 可能仍然被 tasklet_schedule调度, 但是它的执行被延后直到这个tasklet 被再次使能
4.禁止这个
tasklet
void
tasklet_disable_nosync(struct tasklet_struct*t);
禁止这个
tasklet, 但是没有等待任何当前运行的函数退出
5.使能一个之前被禁止的
tasklet
void
tasklet_enable(struct tasklet_struct *t);
6.调度
tasklet 执行
void
tasklet_schedule(struct tasklet_struct *t);
如果一个
tasklet 被再次调度在它有机会运行前,它只运行一次.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息