您的位置:首页 > 其它

内核定时器和tasklet

2011-09-09 13:28 246 查看
1.一个内核定时器是一个数据结构, 它指导内核执行一个用户定义的函数使用一个用户定义的参数在一个用户定义的时间. 这个实现位于 <linux/timer.h> 和kernel/timer.c

2.实际上, 内核定时器被作为一个"软件中断"的结果而实现.

3.内核提供给驱动许多函数来声明, 注册, 以及去除内核定时器

1)timer_list,在linux内核中,timer_list结构体的一个实例对应一个定时器

#include <linux/timer.h>

struct timer_list

{

/* ... */

unsigned long expires;/*定时器到期时间jiffies*/

void (*function)(unsigned long);/*定时器处理函数*/

unsigned long data;/*作为参数被传入定时器处理函数*/

};

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

定义一个名为my_timer的定时器

struct timer_list my_timer;

2)初始化定时器

void init_timer(struct timer_list *timer);

init_timer()函数初始化timer_list的entry的next 为NULL,并给base指针赋值

3)增加定时器

void add_timer(struct timer_list * timer);

注册内核定时器,将定时器加入到内核动态定时器链表中

4)删除定时器

int del_timer(struct timer_list *timer);

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

5)修改定时器expire

int mod_timer(struct timer_list *timer,unsigned long expires);

更新一个定时器的超时时间, 使用一个超时定时器的一个普通的任务(再一次, 关马达软驱定时器是一个典型例子). 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 被再次调度在它有机会运行前,它只运行一次.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: