使用自旋锁实现驱动设备的互斥访问

代码来源: Linux设备驱动开发详解(宋宝华) p172

int xxx_count = 0;    //定义文件打开次数
static int xxx_open(struct inode *inode,struct file *filp)
{
    ...
    spinlock(&xxx_lock);
    if(xxx_count) {
        spin_unlock(&xxx_lock);
        return -EBUSY;
    }
    xxx_count++;
    spin_unlock(&xxx_lock);
    ...
    return 0;
}

static int xxx_release(struct inode *inode,struct file *filp)
{
    ...
    spinlock(&xxx_lock);
    xxx_count--;
    spin_unlock(&xxx_lock);
    
    return 0;
}

①int xxx_count = 0; 首先在驱动中定义一个变量保存设备代开的次数
②当应用打开驱动的时候会执行spinlock(&xxx_lock)函数,获取自旋锁,然后判断xxx_count是否已经打开过了,由于第一次打开的时候xxx_count为0,所以不会执行if中的语句。所以直接执行xxx_count++,然后释放自旋锁。
③当有第二个应用打开设备驱动的时候,首先获取自旋锁,此时由于xxx_count = 1,所以会执行if中的语句,直接释放自旋锁,并返回设备忙。从而实现设备的互斥访问。
④在驱动出口函数中实现xxx_count自减

注意:

获取自旋锁的时间段内,如果有其他应用访问该设备,则会处于忙等待,CPU会循环执行获取锁,不做其他工作,因此自旋锁保护的代码应尽可能短。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值