函数: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查看内核输出信息,出现如图所示结果。
结果分析:
由图的输出信息可以看出函数tasklet_init( )实现了对结构体变量的部分字段的初始化,data字段用函数的第三个参数初始化,字段func也被赋值。
酷客网相关文章:
评论前必须登录!
注册