Linux 驱动开发基础知识——APP 怎么读取按键值(十二)

 个人名片:

🦁作者简介:学生
🐯个人主页:妄北y

🐧个人QQ:2061314755

🐻个人邮箱:2061314755@qq.com
🦉个人WeChat:Vir2021GKBS
🐼本文由妄北y原创,首发CSDN🎊🎊🎊
🐨座右铭:大多数人想要改造这个世界,但却罕有人想改造自己。

专栏导航:

妄北y系列专栏导航:

C/C++的基础算法:C/C++是一种常用的编程语言,可以用于实现各种算法,这里我们对一些基础算法进行了详细的介绍与分享。🎇🎇🎇

QT基础入门学习:对QT的基础图形化页面设计进行了一个简单的学习与认识,利用QT的基础知识进行了翻金币小游戏的制作🤹🤹🤹

Linux基础编程:初步认识什么是Linux,为什么学Linux,安装环境,进行基础命令的学习,入门级的shell编程。🍻🍻🍻

Linux应用开发基础开发:分享Linux的基本概念、命令行操作、文件系统、用户和权限管理等,网络编程相关知识,TCP/IP 协议、套接字(Socket)编程等,可以实现网络通信功能。💐💐💐

Linux项目开发:Linux基础知识的实践,做项目是最锻炼能力的一个学习方法,这里我们会学习到一些简单基础的项目开发与应用,而且都是毕业设计级别的哦。🤸🤸🤸


非常期待和您一起在这个小小的互联网世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨ 

文章介绍:

🎉本篇文章对Linux驱动基础学习的相关知识进行分享!🥳🥳🥳

   在做单片机开发时,要读取 GPIO 按键,我们通常是执行一个循环,不断地检测 GPIO 引脚电平有没有发生变化。但是在 Linux 系统中,读取 GPIO 按键要考虑到效率,引入了很多种方法:查询方式(非阻塞)休眠-唤醒(阻塞方式)poll 方式异步通知方式

如果您觉得文章不错,期待你的一键三连哦,你的鼓励是我创作动力的源泉,让我们一起加油,一起奔跑,让我们顶峰相见!!!💪💪💪

🎁感谢大家点赞👍收藏⭐评论✍️

目录:

目录

一、APP 怎么读取按键值

1.1 驱动的基本技能:

1.2 APP 开发的基本技能:

二、妈妈怎么知道孩子醒了

2.1 时不时进房间看一下:查询方式

2.2 进去房间陪小孩一起睡觉,小孩醒了会吵醒她:休眠-唤醒

2.3 妈妈要干很多活,但是可以陪小孩睡一会,定个闹钟:poll 方式

2.4 妈妈在客厅干活,小孩醒了他会自己走出房门告诉妈妈:异步通知

三、APP 读取按键的 4 种方法

3.1 查询方式

3.2 休眠-唤醒方式

3.3  poll 方式

3.4 异步通知方式 

3.4.1 异步通知的原理:发信号

3.4.2 应用程序之间发信号示例代码

 四、驱动程序提供能力,不提供策略


一、APP 怎么读取按键值

        在做单片机开发时,要读取 GPIO 按键,我们通常是执行一个循环,不断地检测 GPIO 引脚电平有没有发生变化。但是在 Linux 系统中,读取 GPIO 按键要考虑到效率,引入了很多种方法:查询方式(非阻塞)休眠-唤醒(阻塞方式)poll 方式异步通知方式。这 4 种方法并不仅仅用于 GPIO 按键,在所有的 APP 调用驱动程序过程中,都是使用这些方法。通过这 4 种方式的学习,我们可以掌握如下知识:

1.1 驱动的基本技能:

        中断、休眠、唤醒、poll 等机制。

        这些基本技能是驱动开发的基础,其他大型驱动复杂的地方是它的框架及设计思想,但是基本技术就这些。

1.2 APP 开发的基本技能:

        阻塞 、非阻塞、休眠、poll、异步通知

二、妈妈怎么知道孩子醒了

 妈妈怎么知道卧室里小孩醒了?

2.1 时不时进房间看一下:查询方式

        简单,但是累

2.2 进去房间陪小孩一起睡觉,小孩醒了会吵醒她:休眠-唤醒

        不累,但是妈妈干不了活了

2.3 妈妈要干很多活,但是可以陪小孩睡一会,定个闹钟:poll 方式

         要浪费点时间,但是可以继续干活。

         妈妈要么是被小孩吵醒,要么是被闹钟吵醒。

2.4 妈妈在客厅干活,小孩醒了他会自己走出房门告诉妈妈:异步通知

        妈妈、小孩互不耽误

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

三、APP 读取按键的 4 种方法

APP 去读取按键和举例的场景很相似,也有 4 种方法:

查询方式                 休眠-唤醒方式                 poll 方式                 异步通知方式

2、3、4 种方法,都涉及中断服务程序。中断,就像小孩醒了会哭闹一样, 中断不经意间到来,它会做某些事情:唤醒 APP、向 APP 发信号

所以,在按键驱动程序中,中断是核心

        实际上,中断无论是在单片机还是在 Linux 中都很重要。在 Linux 中,中断的知识还涉及进程、线程等。 

写一个驱动程序的套路     

 

写一个驱动程序的套路   

3.1 查询方式

这种方法最简单:和之前的LED驱动程序类似,之前是写引脚来改变高低电平,现在我们是不断读取引脚来查询是否发生电平的变化

        驱动程序中构造、注册一个 file_operations 结构体,里面提供有对应的 open,read 函数。        

        APP 调用 open 时,导致驱动中对应的 open 函数被调用,在里面配置 GPIO 为输入引脚。

        APP 调用 read 时,导致驱动中对应的 read 函数被调用,它读取寄存器,把引脚状态直接返回给 APP。

3.2 休眠-唤醒方式

 驱动程序中构造、注册一个 file_operations 结构体,里面提供有对应的 open,read 函数

        APP 调用 open 时,导致驱动中对应的 open 函数被调用,在里面配置 GPIO 为输入引脚;并且注册 GPIO 的中断处理函数

        APP 调用 read 时,导致驱动中对应的 read 函数被调用,如果有按键数据则直接返回给 APP否则 APP 在内核态休眠

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

        APP 被唤醒后继续在内核态运行,即继续执行驱动代码,把按键数据返回给 APP(的用户空间)。

3.3  poll 方式

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

 驱动程序中构造、注册一个 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 函数被调用,这时驱动程序中含有数据,会直接返回数据。

3.4 异步通知方式 

3.4.1 异步通知的原理:发信号

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

3.4.2 应用程序之间发信号示例代码

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
void my_sig_func(int signo)
{printf("get a signal : %d\n", signo);
}int main(int argc, char **argv)
{int i = 0;signal(SIGIO, my_sig_func);        //事件处理函数,如果这里没有事件处理函数,则收到应用程序的信号就会停下退出,如果有事件处理函数,则收到应用程序后先执行事件处理函数再继续执行不会停止进程while (1) {printf("Hello, world %d!\n", i++);    sleep(2);}return 0;
}

第 13 行注册信号处理函数

第 15 行就是一个无限循环。在它运行期间,你可以 用另一个 APP 发信号给它。 

$ gcc -o signal signal.c // 编译程序
$ ./signal & // 后台运行
$ ps -A | grep signal // 查看进程 ID,假设是 9527
$ kill -SIGIO 9527 // 给这个进程发信号
book@100ask:~/05_嵌入式Linux驱动开发基础知识/source/03_signal_example$ gcc -o signal signal.c
book@100ask:~/05_嵌入式Linux驱动开发基础知识/source/03_signal_example$ ./signal

 

重新开一个进程查询ID

book@100ask:~$ ps -A

book@100ask:~$ kill -SIGIO 4491

这样另一边的进程就收到信息了

 

 四、驱动程序提供能力,不提供策略

        我们的驱动程序可以实现上述 4 种提供按键的方法,但是驱动程序不应该限制 APP 使用哪种方法

        这就是驱动设计的一个原理:提供能力,不提供策略。就是说,你想用哪种方法都行,驱动程序都可以提供;但是驱动程序不能限制你使用哪种方法  。     

大佬觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥任务在无形中完成,价值在无形中升华,让我们一起加油吧!🌙🌙🌙

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/692557.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端简单知识复习

1.symbol类型 Symbol 是 ECMAScript 6 中引入的一种新的基本数据类型&#xff0c;它表示独一无二的值。Symbol 值是通过 Symbol() 函数创建的。 Symbol 值具有以下特点&#xff1a; 独一无二性&#xff08;唯一性&#xff09;&#xff1a;每个通过 Symbol() 函数创建的 Symb…

基于RBAC的权限管理的理论实现和权限管理的实现

权限管理的理论 首先需要两个页面支持&#xff0c;分别是角色管理和员工管理&#xff0c;其中角色管理对应的是角色和权限的配合&#xff0c;员工管理则是将登录的员工账号和员工所处的角色进行对应&#xff0c;即通过新增角色这个概念&#xff0c;让权限和员工并不直接关联&a…

Error creating bean with name ‘formContentFilter‘ defined in class path

问题描述 运行之前能正常的项目出现以上报错&#xff0c;提示创建“formContentFilter”时错误&#xff1b;org.springframework.boot版本2.4.8 org.springframework.beans.factory.BeanCreationException. Message: Error creating bean with name formContentFilter define…

202428读书笔记|《风吹哪页读哪页》——答案在路上,自由在风里,身处井隅,心向璀璨

202428读书笔记|《风吹哪页读哪页》——答案在路上&#xff0c;自由在风里&#xff0c;身处井隅&#xff0c;心向璀璨 文前篇章一 三餐四季篇章二 山水一程篇章三 心之安处篇章四 通关时刻篇章五 瞬间长大 《风吹哪页读哪页》飞扬文室编著&#xff0c;有很多非常经典又惊艳的句…

4款AI写作软件推荐,让文章撰写更加轻松! #学习方法#知识分享

国外ChatGPT爆火&#xff0c;AI写作在国内也引起不小的瞩目&#xff0c;目前国内的AI写作工具少说也有几十上百个&#xff0c;要在这么多AI写作中找出适合自己的工具&#xff0c;一个一个尝试是不太现实的&#xff0c;所以今天就给大家推荐一些款AI写作工具。帮助你少走弯路&am…

【洛谷题解】P1051 [NOIP2005 提高组] 谁拿了最多奖学金

题目链接&#xff1a;[NOIP2005 提高组] 谁拿了最多奖学金 - 洛谷 题目难度&#xff1a;普及- 涉及知识点&#xff1a;判断条件&#xff0c;累加 题意&#xff1a; 分析&#xff1a;直接统计&#xff0c;判断条件&#xff0c;输出即可&#xff08;水&#xff09; AC代码&am…

Stable Diffusion 绘画入门教程(webui)

文章目录 一、前言二、做出的效果三、SD使用流程1、大模型2、关键字3、调参数 一、前言 随着mj和sd绘画软件发布之后&#xff0c;AI绘画开始爆火&#xff0c;很多小伙伴已经挖掘出很多的玩法&#xff0c;哪怕最基础的AI美女、AI壁纸、真人漫改等等都赚的盆满钵满&#xff0c;当…

【Flink】FlinkSQL读取hive数据(批量)

一、简介: Hive在整个数仓中扮演了非常重要的一环,我们可以使用FlinkSQL实现对hive数据的读取,方便后续的操作,本次例子为Flink1.13.6版本 二、依赖jar包准备: 官网地址如下: Overview | Apache Flink 1、我们需要准备相关的jar包到Flink安装目录的lib目录下,我们需…

NC文件不规则裁剪(利用shp文件裁剪)(三)

文章目录 前言实例数据代码部分需要的库加载文件写入地理信息裁剪NC结果 完整代码奉上 前言 Hello大家好呀&#xff0c;最近正好需要用到多个SHP去裁剪NC&#xff0c;按照我以前的两种办法&#xff08;办法1和办法2&#xff09;操作的话&#xff0c;我自己都会破防&#xff0c…

Halcon中打开摄像机

&#xff08;带货广告&#xff1a;需要该套测试设备或者工业相机的及其相关产品的&#xff0c;请私聊我&#xff09; 1、相机说明 使用Basler相机&#xff0c; 2、打开Halcon助手 3、检测相机 4、连接摄像机和采集画面 5、自动生成代码 生成代码后&#xff0c;保存工程到本…

FreeRtos任务调度

一.创建任务函数 xTaskCreate( (TaskFunction_t )start_task, /*要执行的函数&#xff0c;开始任务*/(const char* )"start_task", /*任务名字&#xff0c;建议个函数名一样*/(uint16_t )START_STK_SIZE, (void* …

【PX4-AutoPilot教程-TIPS】PX4控制无人机在Gazebo中飞行时由于视角跟随无人机在画面中心导致视角乱晃的解决方法

PX4控制无人机在Gazebo中飞行时由于视角跟随无人机在画面中心导致视角乱晃的解决方法 问题描述解决方法 问题描述 无人机在Gazebo中飞行时&#xff0c;无人机始终处于画面中央&#xff0c;会带着视角乱晃&#xff0c;在Gazebo中进行任何操作视角都无法固定。 观察Gazebo左侧Wo…

最全软件测试面试问题和回答,全文背熟不拿下offer算我输!

求职&#xff0c;类似于打仗&#xff0c;是一场挑战自己的战斗&#xff0c;也是一场跟用人单位的博弈&#xff0c;更是一场千人过独木桥的厮杀、混战。《孙子谋攻篇》中早就说了&#xff1a;"知己知彼&#xff0c;百战不殆&#xff1b;不知彼而知己&#xff0c;一胜一负&a…

Mac M2芯片配置PHP环境

Mac M2芯片配置PHP环境 1. XAMPP2. PHPBrew(PHP版本管理)安装php7.4.33版本 3. 直接使用homebrew 安装php环境参考 1. XAMPP 官网地址 https://www.apachefriends.org/ 安装 安装完成 web server打开后&#xff0c;在打开localhost 成功&#xff01; 2. PHPBrew(PHP版本管…

单片机01天_stm32f407zg_创建新工程

创建“寄存器版工程” 1、创建工程文件夹 创建工程文件夹“Project”&#xff0c;内部包含文件夹“CMSIS”&&“USER”。 CMSIS&#xff1a;Cortex系列内核接口驱动文件。 USER&#xff1a;存放用户编写的程序文件。 “USER”文件夹内包含“Inc”&&“Src”…

陶陶摘苹果C++

题目&#xff1a; 代码&#xff1a; #include<iostream> using namespace std; int main(){//一、分析问题//已知&#xff1a;10 个苹果到地面的高度a[10],陶陶把手伸直的时候能够达到的最大高度height//未知&#xff1a;陶陶能够摘到的苹果的数目sum。//关系&#xff…

《Solidity 简易速速上手小册》第2章:搭建 Solidity 开发环境(2024 最新版)

文章目录 2.1 安装和配置 Solidity2.1.1 基础知识解析安装 Solidity 编译器配置开发环境熟悉命令行工具 2.1.2 重点案例&#xff1a;配置本地开发环境案例 Demo&#xff1a;配置本地 Solidity 环境案例代码&#xff1a;HelloWorld.sol 2.1.3 拓展案例 1&#xff1a;设置 Remix …

【MySQL】Navicat/SQLyog连接Ubuntu中的数据库(MySQL)

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java对AI的调用开发》 《RabbitMQ》《Spring》《SpringMVC》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 前言一、安装…

Burp常见问题

前言 本文举例了几个常见的软件工具使用问题&#xff0c;文末会提供一些我自己整理和使用的工具资料 。 "在追逐零 Bug 的路上&#xff0c;我们不断学习、改进&#xff0c;更加坚定自己的技术信念。让我们相信&#xff0c;每一个 Bug 都是我们成长的机会。" 一、VM…

2 F. Greetings(离散化+树状数组)

题目链接 F. Greetings 题意 题解 由于两个人的速度是一样的&#xff0c;所以到达终点之前两个人是不会相遇的&#xff0c;考虑一下什么情况两个人会相遇&#xff0c;其中一个人到达终点时&#xff0c;另一个人&#xff0c;终点所在地的前面&#xff0c;并且它的终点在更右边…