现在的位置: 首页 > 综合 > 正文

中断下半部-tasklet

2014年02月22日 ⁄ 综合 ⁄ 共 1171字 ⁄ 字号 评论关闭

本文包含那些内容?
tasklet机制概述;tasklet机制的使用方法;一个阐述tasklet机制调用关系的举例。
本文适合那些人阅读?
想了解linuxer;学习驱动开发的beginner;学习内核模块编程beginner;其他super linux NBer;
参考书籍:
Linux内核设计与实现
Linux操作系统原理与应用

tasklet的实现


tasklet(小任务)机制是中断处理下半部分最常用的一种方法,其使用也是非常简单的。正如在前文中你所知道的那样,一个使用tasklet的中断程序首先会通过执行中断处理程序来快速完成上半部分的工作,接着通过调用tasklet使得下半部分的工作得以完成。可以看到,下半部分被上半部分所调用,至于下半部分何时执行则属于内核的工作。对应到我们此刻所说的tasklet就是,在中断处理程序中,除了完成对中断的响应等工作,还要调用tasklet,如下图示。

tasklet由tasklet_struct结构体来表示,每一个这样的结构体就表示一个tasklet。在<linux/interrupt.h>中可以看到如下的定义:

1 tasklet_struct
2 {
3     struct tasklet_struct
*next;
4     unsigned long state;
5     atomic_t
count;
6     void (*func)(unsigned long);
7     unsigned long data;
8 };

在这个结构体中,第一个成员代表链表中的下一个tasklet。第二个变量代表此刻tasklet的状态,一般为TASKLET_STATE_SCHED,表示此tasklet已被调度且正准备运行;此变量还可取TASKLET_STATE_RUN,表示正在运行,但只用在多处理器的情况下。count成员是一个引用计数器,只有当其值为0时候,tasklet才会被激活;否则被禁止,不能被执行。而接下来的func变量很明显是一个函数指针,它指向tasklet处理函数,这个处理函数的唯一参数为data。

使用tasklet


在使用tasklet前,必须首先创建一个tasklet_struct类型的变量。通常有两种方法:静态创建和动态创建。这样官方的说法仍然使我们不能理解这两种创建到底是怎么一回事。不够透过源码来分析倒是可以搞明白。

在<linux/interrupt.h>中的两个宏:

1 464#define
DECLARE_TASKLET(name, func, data) \
2 465struct
tasklet_struct name = { NULL, 0, ATOMIC_INIT(0), func, data }
3 466
4 467#define
DECLARE_TASKLET_DISABLED(name, func, data) \

抱歉!评论已关闭.