tasklet_disable函数功能描述:函数tasklet_disable( )调用tasklet_disable_nosync( )和tasklet_unlock_wait( )函数,完成增加软中断描述符的count字段的值,使软中断处于睡眠状态,不能响应对应的中断。
tasklet_disable文件包含
#include<linux/interrupt.h>
tasklet_disable函数定义
在内核源码中的位置:linux-3.19.3/include/linux/interrupt.h
函数定义格式:
static inline void tasklet_disable(struct tasklet_struct *t)
{
tasklet_disable_nosync(t);
tasklet_unlock_wait(t);
smp_mb( );
}
tasklet_disable输入参数说明
此函数的输入参数是struct tasklet_struct结构体类型的指针变量,代表软中断的描述符信息,其定义及详细解释参考函数__tasklet_hi_schedule( )分析文档的输入参数说明部分。
tasklet_disable返回参数说明
此函数的返回值是void类型的变量,即函数不返回任何值。
tasklet_disable实例解析
编写测试文件:tasklet_enable_disable.c
头文件引用及全局变量定义:
#include <linux/interrupt.h>
#include <linux/module.h>
MODULE_LICENSE("GPL");
static unsigned long data=0;
static struct tasklet_struct tasklet;
中断处理函数定义:
//自定义软中断处理函数 ,在此处只有显示的功能
static void irq_tasklet_action(unsigned long data)
{
printk("tasklet running. by author\n");
return;
}
模块加载函数定义,验证函数调用:
static int __init tasklet_enable_disable_init(void)
{
printk("into tasklet_enable_disable_init\n");
tasklet_init(&tasklet, irq_tasklet_action, data);
//初始化一个struct tasklet_struct变量
tasklet_schedule(&tasklet); //把软中断放入调度队列,等待调度执行
printk("the count value of the tasklet before tasklet_disable is:%d\n", tasklet.count);
tasklet_disable(&tasklet); //调用tasklet_disable( )使tasklet对应的处理函数不能执行
if(atomic_read(&(tasklet.count)) ! = 0) //测试当前的count值
printk("tasklet is disabled.\n");
/*显示函数tasklet_disable( )调用之后tasklet字段的count值*/
printk("the count value of the tasklet after tasklet_disable is:%d\n", tasklet.count);
tasklet_enable(&tasklet); //调用函数tasklet_enable( )使能tasklet
if(atomic_read(&(tasklet.count))==0) //测试当前count字段的值
printk("tasklet is enabled\n");
/*显示函数tasklet_enable( )调用之后tasklet字段的count值*/
printk("the count value of the tasklet after tasklet_enable is:%d\n", tasklet.count);
tasklet_kill(&tasklet); //等待tasklet被调度执行完毕
printk("out tasklet_enable_disable_init\n");
return 0;
}
模块退出函数定义:
static void __exit tasklet_enable_disable_exit(void)
{
printk("Goodbye tasklet_enable_disable\n");
return;
}
模块加载、退出函数调用:
module_init(tasklet_enable_disable_init);
module_exit(tasklet_enable_disable_exit);
实例运行结果及分析:
编译模块,执行命令insmod tasklet_enable_disable.ko加载模块,然后输入命令dmesg -c,出现如图所示结果。
结果分析:
由图可以看出函数tasklet_disable( )执行之前tasklet字段count的值为0,函数执行之后count字段的值变为1,增加了1,此时中断处于睡眠状态,不能被调度处理。函数tasklet_enable( )执行之后count字段的值变为0,减少了1,此时中断被唤醒,可以被调度执行,由系统输出信息可以看出中断处理函数在tasklet_enable( )执行之后被调度执行了。