Linux驱动并发控制之位原子操作.pdf
文本预览下载声明
Linux 驱动并发控制之位原子操作
本节实验和 “Linux驱动并发控制之整型原子操作”对照着来学习。
位原子操作是利用位操作来实现并发控制 ,整型原子操作是利用整型来实现并发控制。这
两种方式的原理类似。
本章导读
主要内容
并发和竞态
位原子操作
位原子操作
常用的位原子操作函数如下。
设置位
void set_bit (nr ,void *ptr);
清除位
clear_bit (nr ,void *ptr);
改变位
change_bit (nr ,void *ptr );
测试位
test_and_set_bit (nr ,void *ptr);
测试并操作位
test_and_clear_bit (nr ,void *ptr);
test_and_change_bit (nr ,void *ptr );
1
北京迅为电子有限公司 精英版 驱动实验文档
代码
设备注册
在内核平台文件 “arch/arm/mach-exynos/mach-itop4412.c”中定义设备结构体。
struct platform_device s3c_device_atomic_bit_ctl ={
.name = atomic_bit,
.id = -1,
};
注册设备
s3c_device_atomic_bit_ctl,
驱动
如下所示 ,驱动源码文件 atomic_bit.c ,注意 open 和 release 函数中位原子变量的操
作。
#include linux/init.h
#include linux/module.h
/*驱动注册的头文件 ,包含驱动的结构体和注册和卸载的函数*/
#include linux/platform_device.h
/*注册杂项设备头文件*/
#include linux/miscdevice.h
/*注册设备节点的文件结构体*/
#include linux/fs.h
//原子操作的函数头文件
#include asm/atomic.h
#include asm/types.h
#define DRIVER_NAME atomic_bit
#define DEVICE_NAME atomic_bit
MODULE_LICENSE(Dual BSD/GPL);
MODULE_AUTHOR(TOPEET);
2
版本号 :V1.0 日期 :2016-05-10
北京迅为电子有限公司 精英版 驱动实验文档
//定义原子变量,并初始化为 0
//static atomic_t value_atomic =ATOMIC_INIT(0);
//定义位原子变量
unsigned long int value_bit =0;
static int atomic_bit_open(struct inode *inode, struct file *file){
printk(KERN_EMERG atomic_bit open in!\n);
/*if(atomic_read(value_atomic)){
return -EBUSY;
}*/
//atomic_inc(value_atomic);
if(test_bit(0,value_bit)!=0){
return -EBUSY;
}
set_bit(0,value_bit);
printk(KERN_EMERG atomic_bit open success!\n);
return0;
}
static int atomic_bit_release(struct inode *inode, struct file *file){
printk(KERN_EMERG at
显示全部