Linux中APP读取按键的4种方法

查询方式

在这里插入图片描述
驱动程序中构造、注册一个file_operations结构体,里面有对应的open,read函数。
APP 调用 open 时,导致驱动中对应的 open 函数被调用,在里面配置 GPIO 为输入引脚。APP 调用 read 时,导致驱动中对应的 read 函数被调用,它读取寄存器,把引脚状态直接返回给 APP。

休眠-唤醒方式

在这里插入图片描述
驱动程序中构造、注册一个file_operations结构体,里面提供有对应的open、read函数。

  • APP调用open时,导致驱动中对应的open函数被调用,在里面配置GPIO为输入引脚,并且注册GPIO的中断处理函数。
  • APP调用read函数时,导致驱动中对应的read函数被调用,如果有按键,数据则直接返回给APP,否则APP在内核态休眠。
    当用户按下按键时,GPIO 中断被触发,导致驱动程序之前注册的中断服务
    程序被执行。它会记录按键数据,并唤醒休眠中的 APP。
    APP 被唤醒后继续在内核态运行,即继续执行驱动代码,把按键数据返回给
    APP(的用户空间)。

poll方式

休眠-唤醒方式有个缺点:如果用户一直没操作按键,那么APP就会永远休眠。

我们可以给APP定个闹钟,这就是poll方式。

在这里插入图片描述
驱动程序中构造、注册一个 file_operations 结构体,里面提供有对应的open,read,poll函数。

APP调用poll或select函数,意图是“查询”是否有数据,这2个函数都可以指定一个超时时间,即这段时间内没有数据的话就返回错误。
这会导致驱动中对应的poll函数被调用,如果有按键数据则直接返回给APP,否则APP在内核态休眠一段时间。

当用户按下按键时,GPIO 中断被触发,导致驱动程序之前注册的中断服务
程序被执行。它会记录按键数据,并唤醒休眠中的 APP。
如果用户没按下按键,但是超时时间到了,内核也会唤醒 APP。

APP得到poll/select函数的返回结果后,如果确认是有数据的,则再调用read函数,这会导致驱动中的read函数被调用,这时驱动程序中含有数据,会直接返回数据。

异步通知方式

异步通知原理:发信号。
异步通知的实现原理是:内核给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 会继续执行原先被打断的代码。

相关推荐

  1. Spring Boot 6 API请求参数读取方式

    2024-03-28 13:54:03       25 阅读
  2. VUE常用4高级方法

    2024-03-28 13:54:03       41 阅读
  3. js读取json固定数据方法

    2024-03-28 13:54:03       56 阅读
  4. c++类型转换(4转换方式)

    2024-03-28 13:54:03       38 阅读
  5. Android使用USB进行通信4方式

    2024-03-28 13:54:03       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-28 13:54:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-28 13:54:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-28 13:54:03       87 阅读
  4. Python语言-面向对象

    2024-03-28 13:54:03       96 阅读

热门阅读

  1. python借用redis调用大模型,实现摘要的速度优化

    2024-03-28 13:54:03       36 阅读
  2. mysql 用户管理-权限表

    2024-03-28 13:54:03       35 阅读
  3. php:页面链接数据库(封装),其他页面引入方法

    2024-03-28 13:54:03       40 阅读
  4. Hbase常用命令选择题

    2024-03-28 13:54:03       37 阅读
  5. 浅谈AI大模型学习的理论基础和发展

    2024-03-28 13:54:03       41 阅读
  6. 搭建Docker Notary服务

    2024-03-28 13:54:03       44 阅读
  7. 如何在服务器上传/下载文件

    2024-03-28 13:54:03       34 阅读
  8. 【前端学习——css篇】4.px和rem的区别

    2024-03-28 13:54:03       41 阅读
  9. babel.min.js -1

    2024-03-28 13:54:03       33 阅读
  10. 1.linux的时间问题

    2024-03-28 13:54:03       37 阅读
  11. linux的git命令学习[常见命令]

    2024-03-28 13:54:03       43 阅读
  12. npm命令简单详解

    2024-03-28 13:54:03       40 阅读
  13. SpringBoot的config bean使用中的坑

    2024-03-28 13:54:03       46 阅读