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以及异步通知机制。
193 0
|
Ubuntu Linux 开发工具
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十三)APP怎么读取按键值
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十三)APP怎么读取按键值
140 0
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十三)APP怎么读取按键值
|
Web App开发 Java 程序员
Android App监听软键盘按键的三种方式(转)
最近有类似需求,在csdn上刚好发现,粘贴过来,以防止忘记喽 前言:   我们在android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的“GO”按键加载url页面;在点击搜索框的时候,点击右下角的search符号键可以进行搜索;或者在全部数据输入完毕后,点击右下角的"done"就马上进行下一步操作。
1781 0
|
1月前
|
移动开发 小程序
如何让uni-app开发的H5页面顶部原生标题和小程序的顶部标题不一致?
如何让uni-app开发的H5页面顶部原生标题和小程序的顶部标题不一致?
|
2天前
|
编解码 Java Android开发
FFmpeg开发笔记(三十一)使用RTMP Streamer开启APP直播推流
RTMP Streamer是一款开源的安卓直播推流框架,支持RTMP、RTSP和SRT协议,适用于各种直播场景。它支持H264、H265、AV1视频编码和AAC、G711、OPUS音频编码。本文档介绍了如何使用Java版的RTMP Streamer,建议使用小海豚版本的Android Studio (Dolphin)。加载项目时,可添加国内仓库加速依赖下载。RTMP Streamer包含五个模块:app、encoder、rtmp、rtplibrary和rtsp。完成加载后,可以在手机上安装并运行APP,提供多种直播方式。开发者可以从《FFmpeg开发实战:从零基础到短视频上线》获取更多信息。
27 7
FFmpeg开发笔记(三十一)使用RTMP Streamer开启APP直播推流
|
15天前
|
移动开发 小程序 视频直播
FFmpeg开发笔记(二十七)解决APP无法访问ZLMediaKit的直播链接问题
本文讲述了在使用ZLMediaKit进行视频直播时,遇到移动端通过ExoPlayer和微信小程序播放HLS直播地址失败的问题。错误源于ZLMediaKit对HTTP地址的Cookie校验导致401无权限响应。通过修改ZLMediaKit源码,注释掉相关鉴权代码并重新编译安装,解决了此问题,使得ExoPlayer和小程序能成功播放HLS视频。详细解决方案及FFmpeg集成可参考《FFmpeg开发实战:从零基础到短视频上线》一书。
28 3
FFmpeg开发笔记(二十七)解决APP无法访问ZLMediaKit的直播链接问题
|
5天前
|
开发框架 移动开发 JavaScript
SpringCloud微服务实战——搭建企业级开发框架(四十七):【移动开发】整合uni-app搭建移动端快速开发框架-添加Axios并实现登录功能
在uni-app中,使用axios实现网络请求和登录功能涉及以下几个关键步骤: 1. **安装axios和axios-auth-refresh**: 在项目的`package.json`中添加axios和axios-auth-refresh依赖,可以通过HBuilderX的终端窗口运行`yarn add axios axios-auth-refresh`命令来安装。 2. **配置自定义常量**: 创建`project.config.js`文件,配置全局常量,如API基础URL、TenantId、APP_CLIENT_ID和APP_CLIENT_SECRET等。
|
8天前
|
安全 JavaScript 前端开发
kotlin开发安卓app,JetPack Compose框架,给webview新增一个按钮,点击刷新网页
在Kotlin中开发Android应用,使用Jetpack Compose框架时,可以通过添加一个按钮到TopAppBar来实现WebView页面的刷新功能。按钮位于右上角,点击后调用`webViewState?.reload()`来刷新网页内容。以下是代码摘要:
|
13天前
|
缓存 Android开发 Kotlin
【安卓app开发】kotlin Jetpack Compose框架 | 先用OKhttp下载远程音频文件再使用ExoPlayer播放
使用 Kotlin 的 Jetpack Compose 开发安卓应用时,可以结合 OkHttp 下载远程音频文件和 ExoPlayer 进行播放。在 `build.gradle` 添加相关依赖后,示例代码展示了如何下载音频并用 ExoPlayer 播放。代码包括添加依赖、下载文件、播放文件及简单的 Compose UI。注意,示例未包含完整错误处理和资源释放,实际应用需补充这些内容。
|
14天前
|
存储 Android开发 Kotlin
开发安卓app OKhttp下载后使用MediaPlayer播放
在Android Jetpack Compose应用程序中,要使用OkHttp下载远程音频文件并在本地播放,你需要完成以下几个步骤: 1. **添加依赖**:确保`build.gradle`文件包含OkHttp和Jetpack Compose的相关依赖。 2. **下载逻辑**:创建一个`suspend`函数,使用OkHttp发起网络请求下载音频文件到本地。 3. **播放逻辑**:利用`MediaPlayer`管理音频播放状态。 4. **Compose UI**:构建用户界面,包含下载和播放音频的按钮。