Linux下阻塞IO驱动实验实例三

一. 简介

前面两篇学习了两种针对应用程序阻塞式访问设备时,驱动的处理方法。文章地址如下:

Linux下阻塞IO驱动实验实例一-CSDN博客

Linux下阻塞IO驱动实验实例二-CSDN博客

本文继续学习另外一种针对阻塞式访问设备,驱动的实现方式,核心还是使用等待队列的机制。

      

二.  Linux下阻塞IO驱动实验实例三

本实验是在前面阻塞IO实验的基础上进行更改。即在 14_block_io工程的基础上。

1.  实现思路

等待队列的机制如下:

当设备不可访问的时候,就需要将进程对应的等待队列项添加到前面创建的等待队列头中,
只有添加到等待队列头中以后,进程才能进入休眠态。当设备可以访问以后,再将进程对应的等待
队列项从等待队列头中移除即可。

根据等待队列的机制,针对本实验的所实现的阻塞式访问设备时,驱动处理(阻塞部分)分析如下:

当应用程序 read数据时,会调用到驱动中对应的 read功能函数。所以,将等待队列项添加到等待队列头,切换进程状态为休眠态,(当有信号打断时,或者按键按下的中断发生时)之后移除等待队列项,设置进程状态等等的工作,主要在 驱动 read功能函数中实现。

唤醒休眠的进程可能有两种情况:一种被信号打断(即串口输入命令),一种就是按键有一次有效按键操作(按下->释放)。

而当按键按下后,就需要唤醒(上面被休眠)休眠的进程。当按键按下后会触发中断,中断函数中又开启了定时器,进入定时器中断函数中,处理了按键消抖工作,这里就需要唤醒休眠的进程了。

注意:等待队列的使用方法,具体使用方法可以参考Linux内核源码中等待队列的使用。这里可以参考 NXP官方提供的Linux源码(正点原子有提供的)。

2.  驱动代码实现

打开 14_block_io工程,key_irq.c添加阻塞式处理后如下:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/io.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <li
  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值