一. 简介
前面两篇学习了两种针对应用程序阻塞式访问设备时,驱动的处理方法。文章地址如下:
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