Linux内核 tasklet_disable_nosync()

函数:tasklet_disable_nosync( )

文件包含:

        #include<linux/interrupt.h>

函数定义:

在内核源码中的位置: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( )通过增加taslet_struct结构体变量中的count字段的值,使此结构体描述的软中断不能被调度执行,使其处于睡眠状态。

输入参数说明:

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

返回参数说明:

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

实例解析:

编写测试文件: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查看系统输出信息,出现如图所示结果。

Linux内核 tasklet_disable_nosync()

结果分析:

由图可以看出函数tasklet_disable_nosync( )执行之后软中断描述符的count字段的值发生了变化,增加了1,说明函数tasklet_disable_nosync( )使软中断处于睡眠状态,不能被调度执行。函数tasklet_enable( )执行之后count字段的值减为0,使中断被重新唤醒,能够被调度执行,由系统输出信息可以看出函数tasklet_enable( )执行之后中断处理函数被调度执行了。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!