关于《详解》第12.1节按键驱动的进一步阐述

《详解》12.1的按键驱动,是本书的最大失误,应大家的要求,我们很有必要对其进行再次阐述。
         注意标题是“按键”驱动而非“键盘”驱动,按键往往是一个按钮直接对应于一个可中断的GPIO,而键盘则有一个行列矩阵,有一个扫描的过程,由键盘控制器负责扫描、去抖动、得到键值等工作。
         按键驱动的目的是在用户调用read()的时候能够读出来正确的键值,如果用户以阻塞方式打开,则在没有按键事件的情况下,驱动应切出本进程,之后等待按键事件唤醒之。
        因为在一个键被按下的时候,有一定时间的抖动,也就是说刚按下去的时候会弹来弹去数次,这些事件应该被忽略。有的SoC的中断控制器本身支持 debounce功能,会在硬件上去抖,就不再需要软件去抖,否则,软件上最好去抖动。去抖的常规思路是:当一个键被按下的时候,启动一个定时器延迟数十 ms,如果在定时器到期后,键还是按下的,就正式确认一个按下事件,这样,中间数十ms的弹来弹去就自动被过滤掉了。这就是在代码清单12.8的ISR中 启动一个定时器的原因,注意在第6行,只是将状态置为了KEYSTATUS_DOWNX而不是KEYSTATUS_DOWN,在状态是 KEYSTATUS_DOWNX的情况下,从代码清单12.9(timer handler)的第6至13行可以看出,如果还是按下的,就确认确实按下了,将状态置为KEYSTATUS_DOWN。
        为了实现阻塞方式地访问,在没有按键事件的情况下,如果用户调用read(),本进程应该睡眠直到发生按键事件。在代码清单12.11中 s3c2410_key_read()的第17行会通过interruptible_sleep_on()睡眠等待按键事件,而代码清单12.9调用的 keyEvent()中做的事情就是讲一个按键事件放入keydev.head和keydev.tail所管理的事件队列(放入后将使得 keydev.tail != keydev.head成立),这样,在第17行的interruptible_sleep_on()醒来后,跳转执行的第4行(keydev.tail != keydev.head)就可以得到满足,从而执行第8行的copy_to_user()将按键事件拷贝给用户。

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

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

相关文章

几件欣慰的事,关于.Net的培训和嵌入式开发效率

到软件园这边已经好几个月了,以前.Net的相关的一些东西都慢慢的没怎么接触了。而我去一直在关心相关的东西。以前订阅的一些东西还是很有用的,收集一些相关的资料,也了解一些相关的培训信息。值得欣慰的是,很多培训都是在软件园这…

C++_练习—继承_公有继承

公有继承 公有继承 public: 当类的继承方式为公有继承时,基类的公有和保护成员的访问属性在派生类中 不变,而基类的私有成员不可访问。 即基类的公有成员和保护成员被继承到派生类中仍作为派生类的公有成员和保护成员。派生类的其他成员可以直接访问它们。无 论派…

MYSQLMANAGER实例管理器总结

好久没有写文章了,今天来看看MYSQL的实例管理器(MYSQLMANAGER)。一、简单介绍:1、MySQL实例管理器(IM)是通过TCP/IP端口运行的后台程序,用来监视和管理MySQL数据库服务器实例。(如果你之前用过MYSQLD_MULTI…

C++_练习—继承_保护继承

保护继承 protected&#xff1a;保护继承 保护继承&#xff1a;当保护继承时&#xff0c;基类的公有和保护成员变成派生类的保护成员,私有成员不可直接访问&#xff01; 1 #include <iostream>2 3 using namespace std;4 5 class info {6 public:7 void setter(int a…

C++_练习—继承_私有继承

私有继承 私有继承&#xff1a;当私有继承时&#xff0c;基类的公有和保护成员变成派生类的私有成员&#xff0c;私有成员不可直接访问 1 #include <iostream>2 3 using namespace std;4 5 class info {6 public:7 void setter(int a, int b) {8 num a;9 …

这些天

几个月晃一下就过去了&#xff0c;再次重温&#xff0c;呵&#xff0c;已荒废好久&#xff01;忘记了发生过什么&#xff0c;脑子里面已是一片模糊。记得过年时&#xff0c;期盼有个好运的2008&#xff0c;却也发生了伤感的事&#xff0c;高兴的事&#xff0c;和无聊的事&#…

阿里巴巴右侧6滑块VS雅虎右侧6滑块VS自定义6滑块

http://bbs.blueidea.com/thread-2824205-1-2.htmlhttp://bbs.blueidea.com/thread-2824205-1-2.html阿里巴巴&#xff1a;http://www.chenbincb.com.cn/cnblogs/demo13/1.html 雅虎&#xff1a;http://www.chenbincb.com.cn/cnblogs/demo13/2.html 自定义&#xff1a;http://w…

C++_练习—继承_多继承

多继承 多继承&#xff1a;派生类继承多个基类&#xff08;继承多父类特性&#xff09; 语法&#xff1a;class <派生类名>: <继承方式1><基类名1> , <继承方式2><基类名2> , ...{ <派生类类体>; } 1 #include <iostream>2 3 using …

换了坐骑

公司本来发了个DELL D400。好大好沉啊。&#xff08;虽然加了配置&#xff09;所以一直在使用自己的lenovo。今天总算给换了一个别的本本。当然不是新本本啦。不过也不错。毕竟才来还没一年。淘汰给我的那哥们跟我关系不错。他换了新的联想的天逸系列。 也是挺高配的。双核啊。…

C++_练习—继承_构造析构

构造析构 继承与构造析构&#xff1a; 在子类对象构造时&#xff0c;需要调用父类构造函数对其继承得来的成员进行初始化 在子类对象析构时&#xff0c;需要调用父类析构函数对其继承得来的成员进行清理 1 #include <iostream>2 3 using namespace std;4 5 class info1 {…

C++_练习—继承_构造初始化列表

构造初始化列表 构造对象成员的顺序跟初始化列表无关&#xff0c;跟定义顺序有关 1 #include <iostream>2 3 using namespace std;4 5 class info {6 public:7 info(int a) {8 age a;9 cout << age << endl; 10 cout << …

面试历程六:人真的有时候很奇怪

这次记录的不是一个公司的面试过程&#xff0c;而是我这阶段的面试的感受总结。我个人把这次的求职历程分为五个阶段&#xff1a;1. 信心十足阶段这个阶段&#xff0c;一般是出现在刚从原来的公司快要离职到正式离职这段时间&#xff0c;大概有2个星期左右吧&#xff01;在这个…

C++_练习—this指针

this指针 1 #include <iostream>2 3 using namespace std;4 5 class info {6 public:7 info(int age) {8 this->age age;9 cout << age << endl; 10 } 11 12 private: 13 int age; 14 }; 15 16 int main(void) 17 { 1…

Vista修改默认字体

装了Vista之后&#xff0c;发现访问很多网站时字体都不好看。根据网上找到的方法&#xff0c;用Windows XP中的宋体替换Vista中的宋体。1.用 Total Commander (或 WinRAR) 进入 Vista 的 Windows\Fonts 文件夹&#xff0c;simsun.ttc 文件重命名。(我在重命名时&#xff0c;遇到…

LINUX 乱码

vi /etc/sysconfig/i18n 将内容改为 LANG"zh_CN.GB18030"LANGUAGE"zh_CN.GB18030:zh_CN.GB2312:zh_CN"SUPPORTED"zh_CN.GB18030:zh_CN:zh:en_US.UTF-8:en_US:en"SYSFONT"lat0-sun16" 这样中文在SSH,telnet终端就可以正常显示了。 或者…

关于前端url加密方式总结 (Vue-cli中使用)

有的时候链接信息中存在敏感信息或者不想让用户手动修改链接从而改变内容&#xff0c;这时候就需要进行链接加密处理&#xff0c;虽然这种方式只能简单的预防&#xff0c;不过还是能起到一定作用的&#xff0c;这里根据我的思路进行总结处理方式 首先网站页面url都有对应的不同…

PHP用于登录的类,基于MySQL

<? /* * 描述&#xff1a;PHP用于登录的类&#xff0c;基于MySQL */ class Login { var $username; //用户名 var $userpass; //密码 var $userid; //用户id var $userlevel; //用户级别 var $authtable"account"; //…

C++_练习—多态_virtual

多态_virtual /* 父类指针定义对象&#xff0c;当基类与派生类存在相同成员函数&#xff0c;编译器设置为基类中的版本&#xff0c; 为静态多态/静态链接/早绑定&#xff1a;函数调用在程序执行前就准备好了&#xff01; 在父类相同函数前加 virtual 则编译器看指针的内容&a…

qt 错误 多继承 造成错误 “qt_metacast”: 不是“****”的成员

简介 多继承造成“qt_metacast”: 不是“****”的成员错误的解决方案。 原格式 class BezierSurface : public Strategy, public QGLWidget 更改后 class BezierSurface : public QGLWidget, public Strategy 参考链接 CSDN 转载于:https://www.cnblogs.com/eat-too-much/p/113…

百钱百鸡问题

问题陈述&#xff1a; 这是我国古代一道有名的数学难题&#xff0c;要求用100元买100只鸡&#xff0c;其中公鸡五元一只&#xff0c;母鸡三元一只&#xff0c;每种至少买一只&#xff0c;求购买方案&#xff0c;程序中以x代表公鸡&#xff0c;y代表母鸡&#xff0c;z代表小鸡 s…