Linux内核API tasklet_disable_nosync

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查看系统输出信息,出现如图所示结果。

Linux内核API tasklet_disable_nosync

结果分析:

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

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程