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收到信号后,会被打断,先执行信号处理函数:在信号处理函数中调用读取函数,读取按键值。


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


总结


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

相关文章
|
4月前
|
Ubuntu Linux Anolis
Linux系统禁用swap
本文介绍了在新版本Linux系统(如Ubuntu 20.04+、CentOS Stream、openEuler等)中禁用swap的两种方法。传统通过注释/etc/fstab中swap行的方式已失效,现需使用systemd管理swap.target服务或在/etc/fstab中添加noauto参数实现禁用。方法1通过屏蔽swap.target适用于新版系统,方法2通过修改fstab挂载选项更通用,兼容所有系统。
375 3
Linux系统禁用swap
|
4月前
|
Linux
Linux系统修改网卡名为eth0、eth1
在Linux系统中,可通过修改GRUB配置和创建Udev规则或使用systemd链接文件,将网卡名改为`eth0`、`eth1`等传统命名方式,适用于多种发行版并支持多网卡配置。
817 3
|
4月前
|
存储 前端开发 API
可配置化App启动弹窗系统:实现后台动态管理与热更新引导-蜻蜓Q系统laravel+vue3-优雅草卓伊凡
可配置化App启动弹窗系统:实现后台动态管理与热更新引导-蜻蜓Q系统laravel+vue3-优雅草卓伊凡
366 5
可配置化App启动弹窗系统:实现后台动态管理与热更新引导-蜻蜓Q系统laravel+vue3-优雅草卓伊凡
|
Ubuntu Linux 网络安全
Linux系统初始化脚本
一款支持Rocky、CentOS、Ubuntu、Debian、openEuler等主流Linux发行版的系统初始化Shell脚本,涵盖网络配置、主机名设置、镜像源更换、安全加固等多项功能,适配单/双网卡环境,支持UEFI引导,提供多版本下载与持续更新。
489 0
Linux系统初始化脚本
|
4月前
|
存储 前端开发 安全
实现“永久登录”:针对蜻蜓Q系统的用户体验优化方案(前端uni-app+后端Laravel详解)-优雅草卓伊凡
实现“永久登录”:针对蜻蜓Q系统的用户体验优化方案(前端uni-app+后端Laravel详解)-优雅草卓伊凡
243 5
|
5月前
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
347 18
|
4月前
|
安全 Linux Shell
Linux系统提权方式全面总结:从基础到高级攻防技术
本文全面总结Linux系统提权技术,涵盖权限体系、配置错误、漏洞利用、密码攻击等方法,帮助安全研究人员掌握攻防技术,提升系统防护能力。
413 1
|
4月前
|
监控 安全 Linux
Linux系统提权之计划任务(Cron Jobs)提权
在Linux系统中,计划任务(Cron Jobs)常用于定时执行脚本或命令。若配置不当,攻击者可利用其提权至root权限。常见漏洞包括可写的Cron脚本、目录、通配符注入及PATH变量劫持。攻击者通过修改脚本、创建恶意任务或注入命令实现提权。系统管理员应遵循最小权限原则、使用绝对路径、避免通配符、设置安全PATH并定期审计,以防范此类攻击。
1104 1
|
5月前
|
缓存 小程序 iOS开发
基于uni-app+vue3手机桌面oadmin管理系统
基于uniapp+vue3+pinia2+uv-ui仿ios手机界面oa后台系统解决方案。支持运行到h5+小程序+app端。
324 5
|
5月前
|
缓存 监控 Linux
Linux系统清理缓存(buff/cache)的有效方法。
总结而言,在大多数情形下你不必担心Linux中buffer与cache占用过多内存在影响到其他程序运行;因为当程序请求更多内存在没有足够可用资源时,Linux会自行调整其占有量。只有当你明确知道当前环境与需求并希望立即回收这部分资源给即将运行重负载任务之前才考虑上述方法去主动干预。
1771 10

热门文章

最新文章