tasklet_kill函数功能描述:此函数用于阻塞当前线程,等待中断处理函数的执行完毕。此函数通过循环检测中断字段state的值,判断中断处理函数的执行情况,当中断处理函数执行完毕之后,循环结束,然后将字段state清零,函数返回。
tasklet_kill文件包含
#include<linux/interrupt.h>
tasklet_kill函数定义
在内核源码中的位置:linux-3.19.3/kernel/softirq.c
函数定义格式:
void tasklet_kill(struct tasklet_struct *t)
tasklet_kill输入参数说明
此函数的输入参数是struct tasklet_struct结构体类型的指针变量,代表软中断的描述符信息,其定义及详细解释参考函数__tasklet_hi_schedule( )分析文档的输入参数说明部分。
tasklet_kill返回参数说明
此函数的返回值是void类型的变量,即函数不返回任何值。
tasklet_kill实例解析
编写测试文件:tasklet_kill.c
头文件引用及全局变量声明:
#include <linux/interrupt.h>
#include <linux/module.h>
#include <linux/init.h>
MODULE_LICENSE("GPL");
static unsigned long data=0;
static struct tasklet_struct tasklet;
中断处理函数定义:
// 自定义软中断处理函数,在此只有显示功能
static void irq_tasklet_action(unsigned long data)
{
printk("in the irq_tasklet_action the state of the tasklet is :%ld\n", (&tasklet)->state);
printk("tasklet running. by author\n");
return;
}
模块初始化函数,验证函数的调用:
static int __init tasklet_kill_init(void)
{
printk("into tasklet_kill_init\n");
tasklet_init(&tasklet, irq_tasklet_action, data);
//初始化一个struct tasklet_struct变量,对应一个软中断
printk("the state of the tasklet after tasklet_init is :%ld\n", (&tasklet)->state);
//显示当前中断状态
tasklet_schedule(&tasklet); //将中断变量放入软中断执行队列
printk("the state of the tasklet after tasklet_schedule is :%ld\n",
(&tasklet)->state); //显示中断状态
tasklet_kill(&tasklet); //阻塞本线程,等待中断处理函数的执行完毕
printk("the state of the tasklet after tasklet_kill is :%ld\n", (&tasklet)->state);
//显示当前中断状态
printk("out tasklet_kill_init\n");
return 0;
}
模块退出函数:
static void __exit tasklet_kill_exit(void)
{
printk("Goodbye tasklet_kill\n");
return;
}
模块加载、退出函数的调用:
module_init(tasklet_kill_init);
module_exit(tasklet_kill_exit);
实例运行结果及分析:
编译模块,执行命令insmod tasklet_kill.ko插入内核模块,然后输入命令dmesg -c查看内核输出信息,出现如图所示结果。
结果分析:
由图可以看出中断处理函数在模块加载函数之前执行完毕,并且阻塞在函数tasklet_kill( )的位置,函数tasklet_kill( )执行完毕之后,中断的状态值变为0。如果注释调函数tasklet_kill( ),则不会出现如图所示的结果,中断处理函数不会在模块加载函数之前执行完毕,而是在其后执行。