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查看内核输出信息,出现如图所示结果。
结果分析:
由图可以看出函数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。