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


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


总结


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

相关文章
|
1天前
|
IDE Linux 开发工具
Linux 系统上安装
在Linux和Mac上安装Lua 5.3.0只需下载源码,解压,编译和安装。Windows用户可选择SciTE IDE或通过LuaForWindows在Github或Google Code下载安装。创建 HelloWorld.lua,使用`lua HelloWorld.lua`运行显示"Hello World!"。另可参考LuaDist官方推荐方式安装。
|
1天前
|
Ubuntu Linux 编译器
【Linux】详解动静态库的制作和使用&&动静态库在系统中的配置步骤
【Linux】详解动静态库的制作和使用&&动静态库在系统中的配置步骤
|
1天前
|
Linux Windows
虚拟机添加新硬盘之linux系统篇
虚拟机添加新硬盘之linux系统篇
13 1
|
1天前
|
负载均衡 Linux 应用服务中间件
Linux系统中前后端分离项目部署指南
Linux系统中前后端分离项目部署指南
|
1天前
|
监控 JavaScript 网络协议
Linux系统之安装uptime-kuma服务器监控面板
【5月更文挑战第12天】Linux系统之安装uptime-kuma服务器监控面板
10 0
|
1天前
|
Linux Perl
Linux系统的文本处理
Linux系统的文本处理
|
1天前
|
Linux API
Linux系统编程之文件编程常用API回顾和文件编程一般步骤
Linux系统编程之文件编程常用API回顾和文件编程一般步骤
Linux系统编程之文件编程常用API回顾和文件编程一般步骤
|
1天前
|
编解码 Ubuntu Linux
|
1天前
|
Linux
|
1天前
|
Linux
请问如何在Linux系统中删除一个磁盘分区
请问如何在Linux系统中删除一个磁盘分区