tasklet_disable_nosync函数功能描述:函数tasklet_disable_nosync( )通过增加taslet_struct结构体变量中的count字段的值,使此结构体描述的软中断不能被调度执行,使其处于睡眠状态。
tasklet_disable_nosync文件包含
#include<linux/interrupt.h>
tasklet_disable_nosync函数定义
在内核源码中的位置:linux-3.19.3/include/linux/interrupt.h
函数定义格式:
static inline void tasklet_disable_nosync(struct tasklet_struct *t)
{
atomic_inc(&t->count);
smp_mb__after_atomic_inc( );
}
tasklet_disable_nosync输入参数说明
此函数的输入参数是struct tasklet_struct结构体类型的变量,保存一个软中断的描述符信息,其定义及详细解释参看函数__tasklet_hi_schedule( )分析文档的输入参数说明部分。
tasklet_disable_nosync返回参数说明
此函数的返回值是void类型的变量,即此函数不返回任何值。
tasklet_disable_nosync实例解析
编写测试文件:tasklet_disable_nosync.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_disable_nosync_init(void)
{
printk("into tasklet_disable_nosync_init\n");
tasklet_init(&tasklet, irq_tasklet_action, data);
//初始化一个struct tasklet_struct变量
tasklet_schedule(&tasklet); //把软中断加入等待队列,等待调度执行
printk("the value of the tasklet before tasklet_disable_nosync is :%d\n",tasklet.count);
tasklet_disable_nosync(&tasklet);
if(atomic_read(&(tasklet.count)) ! = 0) //测试当前的count值
printk("tasklet is disabled.\n");
/*显示函数tasklet_disable_nosync( )调用之后tasklet字段的count值*/
printk("the value of the tasklet after tasklet_disable_nosync 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 value of the tasklet after tasklet_enable is :%d\n", tasklet.count);
tasklet_kill(&tasklet); //等待软中断的执行结束
printk("out tasklet_disable_nosync_init\n");
return 0;
}
模块退出函数定义:
static void __exit tasklet_disable_nosync_exit(void)
{
printk("Goodbye tasklet_disable_nosync\n");
return;
}
模块加载、退出函数调用:
module_init(tasklet_disable_nosync_init);
module_exit(tasklet_disable_nosync_exit);
实例运行结果及分析:
编译模块,执行命令insmod tasklet_disable_nosync.ko加载模块,然后输入命令dmesg -c查看系统输出信息,出现如图所示结果。
结果分析:
由图可以看出函数tasklet_disable_nosync( )执行之后软中断描述符的count字段的值发生了变化,增加了1,说明函数tasklet_disable_nosync( )使软中断处于睡眠状态,不能被调度执行。函数tasklet_enable( )执行之后count字段的值减为0,使中断被重新唤醒,能够被调度执行,由系统输出信息可以看出函数tasklet_enable( )执行之后中断处理函数被调度执行了。