Linux中的上半部与下半部
- 1、tasklet简介
- 2、tasklet简单使用
- 2.1、初始化tasklet
- 2、调度 tasklet
- 3、流程参考
1、tasklet简介
tasklet 是利用软中断来实现的另外一种下半部机制,Tasklets由tasklet_struct结构表示,每个结构体单独代表一个tasklet,在linux/interrupt.h中定义:
struct tasklet_struct
{struct tasklet_struct *next; unsigned long state; atomic_t count; unsigned long data;
};
2、tasklet简单使用
2.1、初始化tasklet
如果要使用 tasklet,必须先定义一个 tasklet,然后使用 tasklet_init 函数初始化 tasklet。
taskled_init 函数原型如下:
extern void tasklet_init(struct tasklet_struct *t,void (*func)(unsigned long), unsigned long data);
函数参数和返回值含义如下:
t:要初始化的 tasklet
func: tasklet 的处理函数。
data: 要传递给 func 函数的参数
返回值: 没有返回值
也 可 以 使 用 宏 DECLARE_TASKLET 来 一 次 性 完 成 tasklet 的 定 义 和 初 始 化 ,DECLARE_TASKLET 定义在 include/linux/interrupt.h 文件中,定义如下:
#define DECLARE_TASKLET(name, func, data) \
struct tasklet_struct name = { NULL, 0, ATOMIC_INIT(0), func, data }
其中 name 为要定义的 tasklet 名字,这个名字就是一个 tasklet_struct 类型的时候变量, func就是 tasklet 的处理函数, data 是传递给 func 函数的参数。
2、调度 tasklet
在上半部,也就是中断处理函数中调用 tasklet_schedule 函数就能使 tasklet 在合适的时间运
行, tasklet_schedule 函数原型如下:
void tasklet_schedule(struct tasklet_struct *t)
函数参数和返回值含义如下:
t:要调度的 tasklet,也就是 DECLARE_TASKLET 宏里面的 name。
返回值: 没有返回值。
3、流程参考
struct tasklet_struct testtasklet;
void testtasklet_func(unsigned long data)
{
}
irqreturn_t test_handler(int irq, void *dev_id)
{......tasklet_schedule(&testtasklet);......
}
static int __init xxxx_init(void)
{......tasklet_init(&testtasklet, testtasklet_func, data);request_irq(xxx_irq, test_handler, 0, "xxx", &xxx_dev);......
}