APP怎么读取按键值

简介: APP怎么读取按键值

APP怎么读取按键值

在做单片机开发时,要读取GPIO按键,我们通常是执行一个循环,不断地

检测 GPIO 引脚电平有没有发生变化。但是在 Linux 系统中,读取 GPIO 按键要考虑到效率,引入了很多种方法:查询方式(非阻塞)、休眠-唤醒(阻塞方式)、

poll 方式、异步通知方式。

驱动的基本技能:中断、休眠、唤醒、poll 等机制。这些基本技能是驱动开发的基础,其他大型驱动复杂的地方是它的框架及设计思想,但是基本技术就这些。

APP 开发的基本技能:阻塞 、非阻塞、休眠、poll、异步通知。


APP 读取按键的 4 种方法

1.查询方式

2.休眠-唤醒方式

3.poll 方式

4.异步通知方式

第 2、3、4 种方法,都涉及中断服务程序。中断,就像小孩醒了会哭闹一样,中断不经意间到来,它会做某些事情:唤醒 APP、向 APP 发信号。所以,在按键驱动程序中,中断是核心。实际上,中断无论是在单片机还是在 Linux 中都很重要。在 Linux 中,中断的知识还涉及进程、线程等。


查询方式

581f0ac697fb4fa898746562aa2dcd8a.png

工作过程:

驱动程序中构造、注册一个 file_operations 结构体,里面提供有对应的

open,read 函数。APP 调用 open 时,导致驱动中对应的 open 函数被调用,在里面配置 GPIO 为输入引脚。APP 调用 read 时,导致驱动中对应的 read 函数被调用,它读取寄存器,把引脚状态直接返回给 APP。


休眠唤醒方式

47b60df834a04f3b871cf4de96e44111.png

工作过程:

驱动程序中构造、注册一个 file_operations 结构体,里面提供有对应的

open,read 函数。

◼ APP 调用 open 时,导致驱动中对应的 open 函数被调用,在里面配置

GPIO 为输入引脚;并且注册 GPIO 的中断处理函数。

◼ APP 调用 read 时,导致驱动中对应的 read 函数被调用,如果有按键

数据则直接返回给 APP;否则 APP 在内核态休眠。

当用户按下按键时,GPIO 中断被触发,导致驱动程序之前注册的中断服务

程序被执行。它会记录按键数据,并唤醒休眠中的 APP。

APP 被唤醒后继续在内核态运行,即继续执行驱动代码,把按键数据返回给

APP(的用户空间)。


poll方式

上面的休眠-唤醒方式有个缺点:如果用户一直没操作按键,那么 APP 就会

永远休眠。

我们可以给 APP 定个闹钟,这就是 poll 方式。

e65bd885a61644d9a91b564ef970609f.png

工作过程:

驱动程序中构造、注册一个 file_operations 结构体,里面提供有对应的

open,read,poll 函数。

◼ APP 调用 open 时,导致驱动中对应的 open 函数被调用,在里面配置

GPIO 为输入引脚;并且注册 GPIO 的中断处理函数。

◼ APP 调用 poll 或 select 函数,意图是“查询”是否有数据,这 2 个

函数都可以指定一个超时时间,即在这段时间内没有数据的话就返回

错误。这会导致驱动中对应的 poll 函数被调用,如果有按键数据则直

接返回给 APP;否则 APP 在内核态休眠一段时间。

当用户按下按键时,GPIO 中断被触发,导致驱动程序之前注册的中断服务

程序被执行。它会记录按键数据,并唤醒休眠中的 APP。

如果用户没按下按键,但是超时时间到了,内核也会唤醒 APP。

所以 APP 被唤醒有 2 种原因:用户操作了按键,超时。被唤醒的 APP 在内核

态继续运行,即继续执行驱动代码,把“状态”返回给 APP(的用户空间)。

APP 得到 poll/select 函数的返回结果后,如果确认是有数据的,则再调

用 read 函数,这会导致驱动中的 read 函数被调用,这时驱动程序中含有数据,会直接返回数据。


异步通知方式

188d10cfdb4b42a7ab543c0abe7103d2.png

异步通知的实现原理是:内核给 APP 发信号。信号有很多种,这里发的是

SIGIO。

驱动程序中构造、注册一个 file_operations 结构体,里面提供有对应的

open,read,fasync 函数。

◼ APP 调用 open 时,导致驱动中对应的 open 函数被调用,在里面配置

GPIO 为输入引脚;并且注册 GPIO 的中断处理函数。

◼ APP 给信号 SIGIO 注册自己的处理函数:my_signal_fun。

◼ APP 调用 fcntl 函数,把驱动程序的 flag 改为 FASYNC,这会导致驱

动程序的 fasync 函数被调用,它只是简单记录进程 PID。

◼ 当用户按下按键时,GPIO 中断被触发,导致驱动程序之前注册的中断

服务程序被执行。它会记录按键数据,然后给进程 PID 发送 SIGIO 信

号。

◼ APP 收到信号后会被打断,先执行信号处理函数:在信号处理函数中可

以去调用 read 函数读取按键值。

◼ 信号处理函数返回后,APP 会继续执行原先被打断的代码。


驱动程序提供能力,不提供策略

我们的驱动程序可以实现上述 4 种提供按键的方法,但是驱动程序不应该限

制 APP 使用哪种方法。

这就是驱动设计的一个原理:提供能力,不提供策略。就是说,你想用哪种

方法都行,驱动程序都可以提供;但是驱动程序不能限制你使用哪种方法。


目录
相关文章
|
Linux
linux系统中APP读取按键的几种方式
本文以App读取按键的值,来梳理linux驱动中的中断,休眠,唤醒,poll以及异步通知机制。
231 0
|
Ubuntu Linux 开发工具
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十三)APP怎么读取按键值
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十三)APP怎么读取按键值
204 0
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十三)APP怎么读取按键值
|
Web App开发 Java 程序员
Android App监听软键盘按键的三种方式(转)
最近有类似需求,在csdn上刚好发现,粘贴过来,以防止忘记喽 前言:   我们在android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的“GO”按键加载url页面;在点击搜索框的时候,点击右下角的search符号键可以进行搜索;或者在全部数据输入完毕后,点击右下角的"done"就马上进行下一步操作。
1829 0
|
30天前
|
JSON 小程序 JavaScript
uni-app开发微信小程序的报错[渲染层错误]排查及解决
uni-app开发微信小程序的报错[渲染层错误]排查及解决
452 7
|
30天前
|
小程序 JavaScript 前端开发
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
504 1
|
16天前
|
小程序 数据挖掘 UED
开发1个上门家政小程序APP系统,都有哪些功能?
在快节奏的现代生活中,家政服务已成为许多家庭的必需品。针对传统家政服务存在的问题,如服务质量不稳定、价格不透明等,我们历时两年开发了一套全新的上门家政系统。该系统通过完善信用体系、提供奖励机制、优化复购体验、多渠道推广和多样化盈利模式,解决了私单、复购、推广和盈利四大痛点,全面提升了服务质量和用户体验,旨在成为家政行业的领导者。
|
1月前
|
JavaScript 前端开发 小程序
uniapp一个人开发APP关键步骤和考虑因素
uniapp一个人开发APP关键步骤和考虑因素
121 1
uniapp一个人开发APP关键步骤和考虑因素
|
30天前
|
JavaScript 前端开发 UED
Vue与uni-app开发中通过@font-face巧妙引入自定义字体
Vue与uni-app开发中通过@font-face巧妙引入自定义字体
70 9
|
1月前
|
缓存 小程序 索引
uni-app开发微信小程序时vant组件van-tabs的使用陷阱及解决方案
uni-app开发微信小程序时vant组件van-tabs的使用陷阱及解决方案
177 1
|
13天前
|
机器人
布谷直播App系统源码开发之后台管理功能详解
直播系统开发搭建管理后台功能详解!

热门文章

最新文章