Linux内核 tasklet_init()

函数:tasklet_init( )

文件包含:

        #include<linux/interrupt.h>

函数定义:

在内核源码中的位置:linux-3.19.3/kernel/softirq.c

函数定义格式:

void tasklet_init(struct tasklet_struct *t, void (*func)(unsigned long), unsigned long data)

函数功能描述:

函数tasklet_init( )用于初始化一个struct tasklet_struct结构体类型的变量,将其state字段及count字段的值都显示清零,用函数的第二个参数func为结构体变量的func字段赋值,用函数的第三个参数data为结构体变量的data字段赋值,完成对软中断描述符一些基本字段的初始化工作。

输入参数说明:

  • 此函数的第一个参数是struct tasklet_struct结构体类型的变量,对应一个软中断,保存软中断的描述符信息,其定义及详细解释参考函数__tasklet_hi_schedule( )分析文档的输入参数说明部分。

  • 此函数的第二个参数是一个函数指针,代表软中断处理函数,用于给tasklet_struct结构体类型变量的func字段赋值。

  • 此函数的第三个参数代表传给软中断处理函数的参数,用于给tasklet_struct结构体类型变量的data字段赋值。

返回参数说明:

此函数的返回值是void类型变量,即函数不返回任何值。

实例解析:

编写测试文件:tasklet_init.c

头文件引用及全局变量声明:

#include <linux/interrupt.h>
#include <linux/module.h>
#include <linux/init.h>
MODULE_LICENSE("GPL");
static unsigned long data=10;
static struct tasklet_struct tasklet;

中断处理函数定义:

// 自定义软中断处理函数,在此只有显示功能
static void irq_tasklet_action(unsigned long data)
{
    printk("The state of the tasklet is :%ld\n", (&tasklet)->state);
    printk("tasklet running. by author\n");
    return;
}

模块初始化函数,验证函数的调用:

static int   __init tasklet_init_init(void)
{
    printk("into tasklet_init_init\n");

    /*测试函数调用之前结构体一些字段的值*/
    printk("the data value of the tasklet is :%ld\n", tasklet.data);
    if(tasklet.func==NULL)
    {
        printk("the tasklet has not been initialized\n");
    }

    /*初始化一个struct tasklet_struct变量,即申请一个软中断*/
    tasklet_init(&tasklet, irq_tasklet_action, data);

    /*测试函数调用之后,结构体变量一些字段的值*/
    printk("the data value of the tasklet is :%ld\n", tasklet.data);
    if(tasklet.func==NULL)
    {
        printk("the tasklet has not been initialized\n");
    }
    else
    {
        printk("the tasklet has been initialized\n");
    }
    printk("out tasklet_init_init\n");
    return 0;
}

模块退出函数:

static void   __exit tasklet_init_exit(void)
{
    printk("Goodbye tasklet_init\n");
    return;
}

模块加载、退出函数的调用:

module_init(tasklet_init_init);
module_exit(tasklet_init_exit);

实例运行结果及分析:

编译模块,执行命令insmod tasklet_init.ko加载模块,然后输入命令dmesg -c查看内核输出信息,出现如图所示结果。

Linux内核 tasklet_init()

结果分析:

由图的输出信息可以看出函数tasklet_init( )实现了对结构体变量的部分字段的初始化,data字段用函数的第三个参数初始化,字段func也被赋值。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!