Linux内核 tasklet_disable()

函数:tasklet_disable( )

文件包含:

        #include<linux/interrupt.h>

函数定义:

在内核源码中的位置: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( )调用tasklet_disable_nosync( )和tasklet_unlock_wait( )函数,完成增加软中断描述符的count字段的值,使软中断处于睡眠状态,不能响应对应的中断。

输入参数说明:

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

返回参数说明:

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

实例解析:

编写测试文件: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,出现如图所示结果。

Linux内核 tasklet_disable()

结果分析:

由图可以看出函数tasklet_disable( )执行之前tasklet字段count的值为0,函数执行之后count字段的值变为1,增加了1,此时中断处于睡眠状态,不能被调度处理。函数tasklet_enable( )执行之后count字段的值变为0,减少了1,此时中断被唤醒,可以被调度执行,由系统输出信息可以看出中断处理函数在tasklet_enable( )执行之后被调度执行了。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!