Linux 2.4.x内核软中断机制
struct tasklet_struct{ struct tasklet_struct *next; /* 队列指针 */ unsigned long state; /* tasklet的状态,按位操作,目前定义了两个位的含义: TASKLET_STATE_SCHED(第0位)或TASKLET_STATE_RUN(第1位) */ atomic_t count; /* 引用计数,通常用1表示disabled */ void (*func)(unsigned long); /* 函数指针 */ unsigned long data; /* func(data) */}; 把上面的结构与tq_struct比较,可以看出,tasklet扩充了一点功能,主要是state属性,用于CPU间的同步。 tasklet的使用相当简单: 定义一个处理函数void my_tasklet_func(unsigned long); DECLARE_TASKLET(my_tasklet,my_tasklet_func,data); /* 定义一个tasklet结构my_tasklet,与my_tasklet_func(data)函数相关联,相当于DECLARE_TASK_QUEUE() */ tasklet_schedule(&my_tasklet); /* 登记my_tasklet,允许系统在适当的时候进行调度运行,相当于queue_task(&my_task,&tq_immediate)和mark_bh(IMMEDIATE_BH) */可见tasklet的使用比task queue更简单,而且,tasklet还能更好的支持SMP结构,因此,在新的2.4.x内核中,tasklet是建议的异步任务执行机制。除了以上提到的使用步骤外,tasklet机制还提供了另外一些调用接口: DECLARE_TASKLET_DISABLED(name,function,data); /* 和DECLARE_TASKLET()类似,不过即使被调度到也不会马上运行,必须等到enable */ 前面提到过,在2.4.x内核中,bottom half是利用tasklet机制实现的,它表现在所有的bottom half动作都以一类tasklet的形式运行,这类tasklet与我们一般使用的tasklet不同。 在2.4.x中,系统定义了两个tasklet队列的向量表,每个向量对应一个CPU(向量表大小为系统能支持的CPU最大个数,SMP方式下目前2.4.2为32)组织成一个tasklet链表:
|
- ARM 汇编若干问题(一般中断问题与软中断SWI分析)(11-11)
- ARM微处理器的编程模型之:数据类型(08-13)