韦东山一二期衔接视频-同步互斥阻塞

 

需求:同一时间只能有一个程序打开驱动程序
初步思路:设置一个标记,如果打开一次,标记改变,则下次不可打开,关闭程序时,标记复位
但是有漏洞——如何保证打开程序到标记改变期间不被其他程序打断?

在open函数中,设置一个标记

static int canopen = 1;

static int sixth_drv_open(struct inode *inode, struct file *file)

{

if (--canopen != 0)

    {

        canopen++;

        return -EBUSY;

    }

..........

}

同样的,在close函数中添加复原canopen的语句

canopen++;

意思是,每打开一次,canopen就会自减1,那么再次打开时就无法打开,关闭时自加1,复原canopen标记。


但是,open中的判断语句,对应的汇编语句又有多条,读出变量->修改变量->写回,如果在写回之前,有另外的进程也读取到了这个canopen变量,那么也就可以执行后续的代码,即同时有多个进程打开了同一个设备文件。

原子操作的方式

要用到原子操作,使得canopen的读取和修改写回操作不可打断。

static  atomic_t canopen = ATOMIC_INIT(1);

在open函数中,执行自减操作

if (!atomic_dec_and_test(&canopen))

{

    atomic_inc(&canopen);

    return -EBUSY;

}

atomic_dec_and_test(&canopen)会测试canopen变量自减操作后是否为0,如果是0则结果为真,否则为假。

在这里,由于初值为1,执行自减操作后为0,结果为真,这与我们的预期相反,所以取反。

信号量的方式

即用之前先申请,用完后释放。

定义

static DECLARE_MUTEX(button_lock);

在2.6.36版本后的内核就没有DECLARE_MUTEX这个宏了,取而代之的是DEFINE_SEMAPHORE宏,在后来同互斥信号量相关的init_MUTEX、init_MUTEX_LOCKED也从<linux/semaphore.h>文件中移除了。

申请

open函数中获取信号量

down(&button_lock)

释放

up(&button_lock)

这是,如果执行两次测试程序,即打开两次设备文件,则第二个程序不会直接返回错误,而是在申请阶段休眠等待,如果将第一个程序kill掉,则第二个程序会申请信号量成功,从而接着执行。

阻塞和非阻塞

阻塞,即程序遇到不满足的条件时会挂起,等满足条件后再次执行,非阻塞会直接返回错误或者不停地查询状态。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
也可去华为网盘下载! http://dl.dbank.com/c0f2x98c6n# 第1课 环境搭建及工具、概念介绍 第2课 GPIO实验 第3课 存储管理器实验 第4课 MMU实验 第5课 NAND FLASH控制器 第6课 中断控制器 第7课 系统时钟和UART实验 第8课 LCD实验 第9课第1节 u-boot分析之编译体验 第9课第2节 u-boot分析之Makefile结构分析 第9课第3节 u-boot分析之源码第1阶段 第9课第3节 u-boot分析之源码第2阶段 第9课第4节 u-boot分析之u-boot命令实现 第9课第5节 u-boot分析_uboot启动内核 第10课第1节 内核启动流程分析之编译体验 第10课第2节 内核启动流程分析之配置 第10课第3节 内核启动流程分析之Makefile 第10课第4节 内核启动流程分析之内核启动 第11课第1节 构建根文件系统之启动第1个程序 第11课第2节 构建根文件系统之init进程分析 第11课第3节 构建根文件系统之busybox 第11课第4节 构建根文件系统之构建根文件系统 第12课第1节 字符设备驱动程序之概念介绍 第12课第2.1节 字符设备驱动程序之LED驱动程序_编写编译 第12课第2.2节 字符设备驱动程序之LED驱动程序_测试改进 第12课第2.3节 字符设备驱动程序之LED驱动程序_操作LED 第12课第3节 字符设备驱动程序之查询方式的按键驱动程序 第12课第4.1节 字符设备驱动程序之中断方式的按键驱动_Linux异常处理结构 第12课第4.2节 字符设备驱动程序之中断方式的按键驱动_Linux中断处理结构 第12课第4.3节 字符设备驱动程序之中断方式的按键驱动_编写代码 第12课第5节 字符设备驱动程序之poll机制 第12课第6节 字符设备驱动程序之异步通知 第12课第7节 字符设备驱动程序之同步互斥阻塞
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值