一、tasklet相关API
初始化函数:
void tasklet_init(struct tasklet_struct *t,
void (*func)(unsigned long), unsigned long data);
函数参数和返回值含义如下:
t:要初始化的 tasklet
func: tasklet 的处理函数。
data: 要传递给 func 函数的参数
或者使用DECLARE_TASKLET(name, func, data)
调度tasklet函数:
void tasklet_schedule(struct tasklet_struct *t);
其中tasklet_struct 结构体如下:
struct tasklet_struct
{
struct tasklet_struct *next;
unsigned long state;
atomic_t count;
void (*func)(unsigned long); //tasklet执行的函数
unsigned long data; //函数func的入参
};
tasklet是在中断上下文中执行任务的,所以处理过程中其他进程是无法被调度到的,而且中断执行过程中也是无法休眠的,它的适用场景是处理一些耗时短的任务(如果耗时长其他进程得不到调度,系统会卡顿)。
/* by 面朝大海0902 */
二、tasklet使用方法
/* 定义 taselet */
struct tasklet_struct testtasklet;
/* tasklet 处理函数 */
void testtasklet_func(unsigned long data)
{
/* tasklet 具体处理内容 */
}
/* 中断处理函数 */
irqreturn_t test_handler(int irq, void *dev_id)
{
......
/* 调度 tasklet */
tasklet_schedule(&testtasklet);
......
}
/* 驱动入口函数 */
static int __init xxxx_init(void)
{
......
/*初始化tasklet*/
tasklet_init(&testtasklet, testtasklet_func, data);
/* 注册中断处理函数 */
request_irq(xxx_irq, test_handler, 0, "xxx", &xxx_dev);
......
}
此处参考《【正点原子】I.MX6U嵌入式Linux驱动开发指南》
三、驱动使用实例及实验结果
/* by 面朝大海0902 /
tasklet的驱动使用代码与下一节我们讲的Linux中断子系统—工作队列重复率很高,所以驱动代码及相关验证,我们与下一讲合二为一,详细请参考下一节Linux中断子系统—工作队列。
/ by 面朝大海0902 */