tasklet
tasklet vs 内核定时器
相同:始终在中断期间运行,始终会在调度他们的同一CPU上运行,而且都接收一个unsigned long参数
不同:不可以要求tasklet在某一给定的时间执行
tasklet对中断处理例程来说尤其有用。中断处理例程必须尽可能快的管理硬件中断,而大部分数据管理则可以安全的延迟到其后的时间。
实际上,与内核定时器类似,tasklet也会在“软件中断”上下文以原子模式执行。软件中断指打开硬件中断的同时执行某些异步任务的内核机制。
tasklet以数据结构形式存在,并在使用前必须初始化。调用特定的函数或者使用特定的宏来声明该结构,即可完成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); #define DECLARE_TASKLET(name, func, data) \ struct tasklet_struct name = { NULL, 0, ATOMIC_INIT(0), func, data } #define DECLARE_TASKLET_DISABLED(name, func, data) \ struct tasklet_struct name = { NULL, 0, ATOMIC_INIT(1), func, data } void tasklet_disable(struct tasklet_struct *t); /*函数暂时禁止给定的 tasklet被 tasklet_schedule 调度,直到这个 tasklet 被再次被enable;若这个 tasklet 当前在运行, 这个函数忙等待直到这个tasklet退出*/ void tasklet_disable_nosync(struct tasklet_struct *t); /*和tasklet_disable类似,但是tasklet可能仍然运行在另一个 CPU */ void tasklet_enable(struct tasklet_struct *t); /*使能一个之前被disable的 tasklet;若这个 tasklet 已经被调度, 它会很快运行。 tasklet_enable 和tasklet_disable必须匹配调用, 因为内核跟踪每个 tasklet 的"禁止次数"*/ void tasklet_schedule(struct tasklet_struct *t); /*调度 tasklet 执行&
|