嵌入式Linux网络体系结构设计与TCP/IP协议栈
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2.3 tasklet

tasklet是可以被调度执行的特殊函数,在系统某个特定的安全时间运行在软件中断的执行现场。tasklet的特点是:

● 由函数tasklet_schedule调度执行,一个tasklet只运行一次。

    static inline void tasklet_schedule(struct tasklet_struct *t)

● 一个tasklet一次只能在一个CPU上执行。

● 不同的tasklet可以同时在不同的CPU上运行。

实现tasklet的过程可分为以下几个步骤完成:

① 编写tasklet的处理函数,如func。

② 用宏declare tasklet (name,func,data)声明一个新的tasklet,name为该tasklet的名称,func为该tasklet要执行的函数,data是传送给tasklet处理函数的数据。

③ 用tasklet_schedule调度tasklet执行。

除此以外,函数tasklet_disable和tasklet_enable可以分别用于禁止和允许tasklet的运行。下面给出一个简单的例子来了解tasklet的实现。

    void my_func(unsigned long);                   /*tasklet的处理函数*/
    char tasklet_data[] = "This is a new tasklet"; /*tasklet处理程序需要的数据*/
    DECLARE_TASKLET(my_tasklet, my_func, (unsigned long) &tasklet_data);  /* 声明tasklet */
    void my_func(unsigned long data)               /*实现tasklet函数*/
    {
        /* 完成函数体*/
    }
    …
    /*调度新定义的tasklet */
    tasklet_schedule(&my_tasklet);