现在的位置: 首页 > 综合 > 正文

linux tasklet 数据结构解析

2013年05月24日 ⁄ 综合 ⁄ 共 2124字 ⁄ 字号 评论关闭

     一、struct tasklet_struct   

     每个tasklet_struct 结构代表tasklet链表中的一个独立的小任务。其定义如下:

        struct tasklet_struct {

                struct tasklet_struct *next;                      /* 指向链表中的下一个tasklet(任务)*/           

                unsigned long state;                               /* tasklet 的状态*/

                atomic_t  count;                                       /* 引用计数 */

                void (*func)(unsigned long data);        /*  tasklet处理函数 */

                unsigned long data;                               /* 给tasklet处理函数的参数 */

        };

 

        原子计数count:对这个tasklet的引用计数值。NOTE!只有当count等于0时,
                                      tasklet代码段才能执行,也即此时tasklet是被使能的;如果

                                      count非零,则这个tasklet是被禁止的。任何想要执行一个

                                      tasklet代码段的人都首先必须先检查其count成员是否为0。

        state                  :定义了这个tasklet的当前状态。这一个32位的无符号长整数,

                                       当前只使用了bit[1]和bit[0]两个状态位。其中,bit[1]

                                       =1表示这个tasklet当前正在某个CPU上被执行,它仅对SMP

                                       系统才有意义,其作用就是为了防止多个CPU同时执行一个
                                       tasklet的情形出现;bit[0]=1表示这个tasklet已经被调度

                                       去等待执行了。

                                       对这两个状态位的宏定义如下所示(interrupt.h):
                                       enum
                                       {
                                               TASKLET_STATE_SCHED, /* Tasklet is scheduled for execution */
                                               TASKLET_STATE_RUN /* Tasklet is running (SMP only) */
                                        };

   二、tasklet_init

        void tasklet_init(struct tasklet_struct *t,  void (*func)(unsigned long), unsigned long data)
        {
                 t->next = NULL;
                 t->state = 0;
                 atomic_set(&t->count, 0);
                 t->func = func;
                 t->data = data;
         }
        函数tasklet_init初始化一个tasklet,其参数t是tasklet_struct结构描述的tasklet,参数(*func)是软中断响应函数。
 
    三、tasklet_schedule
        static inline void tasklet_schedule(struct tasklet_struct *t)
        {
                 if (!test_and_set_bit(TASKLET_STATE_SCHED, &t->state))
                 __tasklet_schedule(t);
         }

 

抱歉!评论已关闭.