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以及异步通知机制。
191 0
|
Ubuntu Linux 开发工具
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十三)APP怎么读取按键值
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十三)APP怎么读取按键值
138 0
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十三)APP怎么读取按键值
|
Web App开发 Java 程序员
Android App监听软键盘按键的三种方式(转)
最近有类似需求,在csdn上刚好发现,粘贴过来,以防止忘记喽 前言:   我们在android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的“GO”按键加载url页面;在点击搜索框的时候,点击右下角的search符号键可以进行搜索;或者在全部数据输入完毕后,点击右下角的"done"就马上进行下一步操作。
1776 0
|
1月前
|
移动开发 小程序
如何让uni-app开发的H5页面顶部原生标题和小程序的顶部标题不一致?
如何让uni-app开发的H5页面顶部原生标题和小程序的顶部标题不一致?
|
1月前
|
API 数据安全/隐私保护 iOS开发
利用uni-app 开发的iOS app 发布到App Store全流程
利用uni-app 开发的iOS app 发布到App Store全流程
132 3
|
1月前
|
Android开发 开发者 UED
个人开发 App 成功上架手机应用市场的关键步骤
个人开发 App 成功上架手机应用市场的关键步骤
|
2天前
|
前端开发 JavaScript Android开发
手机APP开发|基于安卓APP实现掌上党支部——党员app
手机APP开发|基于安卓APP实现掌上党支部——党员app
|
4天前
|
存储 Android开发 Kotlin
Kotlin开发安卓app,在使用 MediaPlayer 播放 res/raw 中的音乐时遇到突然中断的问题,而 onErrorListener 没有接收到任何报错
在使用 Android MediaPlayer 播放 res/raw 中的音乐时遇到中断问题,可能的原因包括资源问题、媒体文件编码格式、生命周期管理和设备资源配置。要排查问题,检查音频文件是否正确包含,格式编码是否支持,MediaPlayer 是否正确管理及释放,以及设备是否有足够存储和配置。通过设置 onErrorListener 日志和确保在 onDestroy 中释放资源来调试。如果文件过大,考虑使用 AssetManager。遵循这些步骤可帮助诊断并解决播放中断的问题。
|
4天前
|
Android开发 Kotlin
kotlin开发安卓应用 如何修改app安装后的名称
在 Android 应用中,要修改安装后的显示名称,需更新 AndroidManifest.xml 文件中 application 标签的 android:label 属性。可直接在该属性内设置新名称,或在 res/values/strings.xml 文件中修改 app_name 并在 manifest 中引用。推荐使用 strings.xml 方式,以便支持多语言和集中管理。
|
4天前
|
缓存 Android开发 Kotlin
【安卓app开发】kotlin Jetpack Compose框架 | 先用OKhttp下载远程音频文件再使用ExoPlayer播放
使用 Kotlin 的 Jetpack Compose 开发安卓应用时,可以结合 OkHttp 下载远程音频文件和 ExoPlayer 进行播放。在 `build.gradle` 添加相关依赖后,示例代码展示了如何下载音频并用 ExoPlayer 播放。代码包括添加依赖、下载文件、播放文件及简单的 Compose UI。注意,示例未包含完整错误处理和资源释放,实际应用需补充这些内容。