概述:
**********tasklet是关于中断管理的,说白了,也就是当中断发生时,执行中断处理函数
**********tasklet是一个数据结构----------------->在<linux/interrupt.h>头文件中
struct tasklet_struct { struct tasklet_struct *next; unsigned long state; atomic_t count; void (*func)(unsigned long); //中断处理函数 unsigned long data; //传递给中断处理函数的参数 };
**********tasklet类似于定时器timer,但是,tasklet中断处理函数一直在中断时间运行,并且在调用tasklet的进程上下文上运行,也就是它们的运行都在同一CPU上(同一时刻只能一方能运行).
**********tasklet执行函数的执行,是不能够通过指定的时间来让它运行的,它的运行是由内核自己选择的时间来执行
Tasklet的使用步骤:
**********第一步:初始化tasklet
初始化的(宏)函数:
*****动态初始化
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);
**********第二步:调度tasklet执行,
/**
*如果一个tasklet在它有机会运行前被再次调度,那么它只会运行一次
*如果tasklet在运行中被调度,它在完成本次调度之后,会再次运行
**/
void tasklet_schedule(struct tasklet_struct *t);或
/**
*调度高优先级的tasklet
*当软件中断处理运行时,在其他软中断之前,它处理高优先级的tasklet
**/
void tasklet_hi_schedule(struct tasklet_struct *t);其他tasklet相关函数:
/**
*禁止给定的tasklet
*如果tasklet还在被tasklet_schedule调度,则此函数的执行将会在tasklet_schedule返回后执行
**/
void tasklet_disable(struct tasklet_struct *t);
/**
*禁止这个tasklet
*不等待任何函数返回,就立即禁止这个tasklet
**/
void tasklet_disable_nosync(struct tasklet_struct *t);
/**
*使能一个之前被禁止的tasklet
*如果tasklet已经被调度了,它会很快的运行
*tasklet_enable和tasklet_disable必须成对匹配,因为内核跟踪tasklet的"禁止次数"
**/
void tasklet_enable(struct tasklet_struct *t);
/**
*杀死tasklet
*当一个设备正在关闭或者模块被卸载时调用这个函数
**/
void tasklet_kill(struct tasklet_struct *t);