Linux内核API tasklet_unlock

tasklet_unlock函数功能描述:函数tasklet_unlock( )在实现中调用了函数clear_bit( ),此函数用于对tasklet_struct结构体变量中的state字段的bit[1]清零,即使中断处于可被CPU调度执行的状态。

tasklet_unlock文件包含

#include<linux/interrupt.h>

tasklet_unlock函数定义

在内核源码中的位置:linux-3.19.3/include/linux/interrupt.h

函数定义格式:

static inline void tasklet_unlock(struct tasklet_struct *t)
{
        smp_mb__before_atomic( );
        clear_bit(TASKLET_STATE_RUN, &(t)->state);
}

tasklet_unlock输入参数说明

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

tasklet_unlock返回参数说明

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

tasklet_unlock实例解析

编写测试文件:tasklet_trylock_unlock.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)
{
    int result=-1;
    printk("tasklet running. by author\n");
    printk("in irq_tasklet_action the state of the tasklet is :%ld\n",
(&tasklet)->state);                              //显示中断状态
    result=tasklet_trylock(&tasklet);        //尝试改变中断的状态
    if(result==0)                           //判断函数执行结果
        printk("tasklet_trylock failed\n");
    else
        printk("tasklet_trylock success\n");
    printk("out irq_tasklet_action\n");
    return;
}

模块加载函数定义,验证函数调用:

static int   __init tasklet_trylock_unlock_init(void)
{
    int result=-1;
    printk("into tasklet_trylock_unlock_init\n");
    tasklet_init(&tasklet, irq_tasklet_action, data); //初始化软中断变量
    tasklet_schedule(&tasklet);                           //将软中断变量加入中断队列
    printk("the state of the tasklet before tasklet_trylock is :%ld\n", tasklet.state);
                                                          //显示中断状态
        result=tasklet_trylock(&tasklet);                 //尝试改变中断的状态
    if(result==0)                                         //判断函数执行结果
        printk("tasklet_trylock failed\n");
    else
        printk("tasklet_trylock success\n");
    printk("the state of the tasklet after tasklet_trylock is :%ld\n", tasklet.state);
                                                          //显示中断的状态
    tasklet_unlock(&tasklet);                             //尝试改变中断的状态
    printk("the state of the tasklet after tasklet_unlock is :%ld\n", tasklet.state);
                                                          //显示中断的状态
    tasklet_kill(&tasklet);                               //等待中断处理函数的执行完毕
    printk("out tasklet_trylock_unlock_init\n");
    return 0;
}

模块退出函数定义:

static void   __exit tasklet_trylock_unlock_exit(void)
{
    printk("Goodbye tasklet_trylock_unlock\n");
    return;
}

模块加载、退出函数调用:

module_init(tasklet_trylock_unlock_init);
module_exit(tasklet_trylock_unlock_exit);

实例运行结果及分析:

编译模块,输入命令insmod tasklet_trylock_unlock.ko加载模块,然后输入命令dmesg -c查看内核输出信息,出现如图所示结果。

Linux内核API tasklet_unlock

结果分析:

由图可以看出函数tasklet_trylock( )执行之后state字段的值变为3,即bit[1]=1、bit[0]=1。bit[0]=1是函数tasklet_schedule( )执行的结果,函数tasklet_trylock( )的返回结果是1,说明该函数正确执行,bit[1]=1说明函数tasklet_trylock( )返回结果是1时,能够设置state的bit[1]的值为1。函数tasklet_unlock( )执行之后,state的值变为1,恢复函数tasklet_trylock( )执行之前的值,说明函数tasklet_unlock( )成功地清除了state字段的bit[1]。在中断处理函数中函数tasklet_trylock( )的返回结果是0,因为此时中断处理函数正在执行,state字段的bit[1]的值为1,中断不能再被其他CPU调度,所以设置失败,返回0。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程