linux系统中APP读取按键的几种方式

简介: 本文以App读取按键的值,来梳理linux驱动中的中断,休眠,唤醒,poll以及异步通知机制。

应用程序读取按键的方式


  • 查询方式:实时查询


  • 休眠-唤醒方式:无数据休眠,有数据唤醒


  • poll方式:设置超时机制,在设置时间,有数据返回,无数据休眠,超时后直接返回无数据状态


  • 初步通知方式:内核主动通知用户有数据


这几种方式没有优劣之分,在不同的场合使用不同的方式。


查询方式


image.png


  • 构造一个file_operations结构体


  • drv_open配置GPIO为输入模式


  • drv_read返回预设状态


  • APP直接通过调用读取,导致驱动中的读取函数被调用,返回初始的状态


休眠唤醒方式


image.png


  • 构造一个file_operations结构体


  • drv_open配置GPIO为中断模式


  • drv_read有按键数据,直接返回给APP;否则内核态休眠


  • 当用户点击按键时,GPIO中断被触发,导致驱动程序之前注册的中断服务程序被执行,它会记录按键数据,并唤醒休眠中的APP


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


poll方式


上面的休眠-唤醒方式有一个缺点:如果用户一直没有操作按键,那么APP将永远休眠。我们可以给APP定个闹钟,这就是poll方式。


image.png


  • 构造一个file_operations结构体,提供对应的open,read,poll函数


  • 这两个函数可以设置一个超时时间,即在这段时间没有数据的话就返回错误。这会导致驱动中的poll或者选择被调用。如果有按键数据则直接返回按键数据给APP,否则APP在内核态休眠移动时间


  • 当用户点击按键时,GPIO触发中断,导致驱动中的中断服务程序被执行,记录按键数据,同时唤醒休眠中的APP


  • 如果用户没有按键,超时了内核也会唤醒APP


  • APP得到投票/选择函数返回结果后,如果确认有数据,则在调用中读取。


异步通知


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


image.png


  • 构造一个file_operations结构体,提供对应的open,read,fasync函数


  • APP给信号注册自己的信号处理函数


  • APP调用fcntl函数,把驱动程序的标志设置为FASYNC,这会导致驱动程序的fasync函数被调用,它只是简单的记录进程PID


  • 当用户点击按键后,GPIO中断触发,导致驱动中中断服务处理程序被调用,记录按键数据,然后给进程PID发送SIGIO信号


  • APP收到信号后,会被打断,先执行信号处理函数:在信号处理函数中调用读取函数,读取按键值。


  • 信号处理函数返回,继续执行后续的代码


总结


以上介绍了多种方式处理读取按键值,提供不同的策略,没有好坏之分。

相关文章
|
5天前
|
存储 前端开发 API
可配置化App启动弹窗系统:实现后台动态管理与热更新引导-蜻蜓Q系统laravel+vue3-优雅草卓伊凡
可配置化App启动弹窗系统:实现后台动态管理与热更新引导-蜻蜓Q系统laravel+vue3-优雅草卓伊凡
83 5
可配置化App启动弹窗系统:实现后台动态管理与热更新引导-蜻蜓Q系统laravel+vue3-优雅草卓伊凡
|
5天前
|
存储 前端开发 安全
实现“永久登录”:针对蜻蜓Q系统的用户体验优化方案(前端uni-app+后端Laravel详解)-优雅草卓伊凡
实现“永久登录”:针对蜻蜓Q系统的用户体验优化方案(前端uni-app+后端Laravel详解)-优雅草卓伊凡
73 5
|
1月前
|
缓存 小程序 开发工具
最新原创uniapp+vue3仿微信界面聊天app系统
最新原创研发uniapp+vue3实战跨端仿微信App界面聊天程序。支持运行到H5+小程序+APP端。
128 5
最新原创uniapp+vue3仿微信界面聊天app系统
|
1月前
|
缓存 小程序 iOS开发
基于uni-app+vue3手机桌面oadmin管理系统
基于uniapp+vue3+pinia2+uv-ui仿ios手机界面oa后台系统解决方案。支持运行到h5+小程序+app端。
135 5
|
1月前
|
缓存 监控 Linux
Linux系统清理缓存(buff/cache)的有效方法。
总结而言,在大多数情形下你不必担心Linux中buffer与cache占用过多内存在影响到其他程序运行;因为当程序请求更多内存在没有足够可用资源时,Linux会自行调整其占有量。只有当你明确知道当前环境与需求并希望立即回收这部分资源给即将运行重负载任务之前才考虑上述方法去主动干预。
681 10
|
1月前
|
安全 Linux 数据安全/隐私保护
为Linux系统的普通账户授予sudo访问权限的过程
完成上述步骤后,你提升的用户就能够使用 `sudo`命令来执行管理员级别的操作,而无需切换到root用户。这是一种更加安全和便捷的权限管理方式,因为它能够留下完整的权限使用记录,并以最小权限的方式工作。需要注意的是,随意授予sudo权限可能会使系统暴露在风险之中,尤其是在用户不了解其所执行命令可能带来的后果的情况下。所以在配置sudo权限时,必须谨慎行事。
296 0
|
1月前
|
安全 测试技术 虚拟化
Omnissa App Volumes 4, version 2506 - 实时应用程序交付系统
Omnissa App Volumes 4, version 2506 - 实时应用程序交付系统
51 0
|
1月前
|
Ubuntu Linux 开发者
国产 Linux 发行版再添新成员,CutefishOS 系统简单体验
当然,系统生态构建过程并不简单,不过为了帮助国产操作系统优化生态圈,部分企业也开始用国产操作系统替代 Windows,我们相信肯定会有越来越多的精品软件登录 Linux 平台。
103 0
|
1月前
|
Ubuntu 安全 Linux
Linux系统入门指南:从零开始学习Linux
Shell脚本是一种强大的自动化工具,可以帮助您简化重复的任务或创建复杂的脚本程序。了解Shell脚本的基本语法和常用命令,以及编写和运行Shell脚本的步骤,将使您更高效地处理日常任务。
192 0
|
1月前
|
Ubuntu Linux 图形学
Linux学习之Linux桌面系统有哪些?
Cinnamon:与MATE类似,Cinnamon 拥有 GNOME 和 Unity 等其它桌面环境所没有的种种功能,是高度可定制的桌面环境,不需要任何外部插件、窗口组件和调整工具来定制桌面。
110 0