os如何处理键盘的所有按键,显示or不显示,显示是如何显示
【0】README
0.1) source code and text decription are from orange’s implemention of a os , and for complete code , please visit 我待会上传;
【1】 键盘输入缓冲区
step1)缓冲区的数据结构如下:
step2)对缓冲区进行添加操作:(只是对 keyboard_handler 添加了一些代码, 上述荔枝图)
step3)修改后的init_keyboard
step4)初始化时钟中断
【2】用添加的新任务处理键盘操作
- 终端任务:我们的任务不仅会处理键盘操作、还会处理屏幕输出等内容, 这些操作共同组成同一个任务——终端任务;
keyboard_read():将扫描码从缓冲区读出,并打印;缓冲区的r_tail 指针移动, 而你是否记得将扫描码存入缓冲区 是 缓冲区的 head指针移动;
【3】解析扫描码
Attention:下面就是对 keyboard_read进行扩展了,像添加对小写字符,数字的处理, 后面是 F1~F12的键处理, shift键处理,home键的处理等等;
Conclusion)修改的代码内容包括:添加了键盘中断缓冲区的代码,修改了 keyboard_handler()函数 + init_keyboard()函数 + 对小写字母和数字的处理代码;
C1.1)我们给出修改后的代码调用过程(重点在于 keyboard_handler()函数 + init_keyboard()函数 ):
C1.2)如何取到用户键入的数据,以及显示它们;
C2)运行结果为:
3.1)处理shift、alt、ctrl
注意:要将键的左右两边加以区分,如左shift和右shift的功能是不同的;(上上图以及说明了)
3.2)处理所有按键
存在的问题-Problems 和 解决方法Solutions:
- Problem1)如果扫描码更加复杂一些,比如超过3个字符,如今的程序还不足以很好地处理;
因为当一个扫描码有不止一个字符时, 实际上会产生不止一次中断。- 看个荔枝:如果我们按一下Shift + A,产生的 0x2A0x1E0x9E0xAA 是4次中断接收来的;
- step1) 我们的键盘控制器8042 接收来自 键盘编码器8048 传送过来的键入数据的相应扫描码;
- step2) 8042收到扫描码后,会把该扫描码 编码成 make code+break code的形式, 并将其放置到输入缓冲区中,而8042的 输入缓冲寄存器只有一个字节来存储扫描码;;
- step3) 8042告诉 中断控制寄存器8259A 产生中断, 交给键盘中断处理程序去执行;(如果此时键盘又有新的键被按下,键盘控制器8042 将不再接收 键盘编码器8048传送过来的扫描码,一直到缓冲区被清空,所以这就是为什么引入输入缓冲区的原因.)
- 我们再来个补充(对比假设):
- 假设1)添加键盘输入缓冲区(占用内存空间)后:只要键入数据,那么就会触发键盘中断处理程序,该程序会从 键盘控制器8042的输入缓冲寄存器中读取键入数据的扫描码,并存储在键盘输入缓冲区中(之前已经建立在内存空间中了),也即让8042的输入缓冲区被清空,这样8042才会接收 键盘编码器8048传送过来的键入数据的 扫描码;
- 假设2) 如果不添加键盘输入缓冲区(占用内存空间):只要键入数据,那么就会触发键盘中断处理程序,该程序会从 键盘控制器8042的输入缓冲寄存器中读取键入数据的扫描码,并显示该扫描码对应的数据;
- 假设2中的问题):如果CPU没有立即响应中断处理程序 怎么办? 这使得8042的输入缓冲区不能被清空,反正一句话,就是要尽快让键盘控制器8042的输入缓冲器清空,这样才能使得8042可以连续不断地接受8048 传送过来的扫描码;
- 看个荔枝:如果我们按一下Shift + A,产生的 0x2A0x1E0x9E0xAA 是4次中断接收来的;
Solution1)我们将 从键盘控制器 8042 的输入缓冲寄存器(只能缓冲一个字节的数据)中读取数据的代码从 keyboard_read 函数中抽取出来,并封装到 get_byte_from_kbuf()函数中; 这样对于扫描码比较长的字符来说,我们可以通过 keyboard_read 函数多次读取键盘缓冲区中的数据(键入数据的扫描码而已);
键盘缓冲区的作用(function)(干货):
- 有了键盘缓冲区, 8042 缓冲区 无需受到 task_tty 进程运行状况的影响,因为键盘中断处理程序 是将输入的数据 保存到内存缓冲区去了,这样键盘控制器8042的输入缓冲器被清空,可以继续接受8048传送过来的扫描码;
Problem2)关于非打印字符的问题: 如果按下 诸如 F1、F2这样的功能键,系统会把它当做可打印字符来处理,从而打印出一个奇怪的符号;
Solutions2)我们的意思是: keyboard_read这个函数只是 负责读取扫描码就可以了(一次或多次调用get_byte_from_kbuf 函数 ),至于如何处理, 不应该由它来负责(因为不是所有键入的字符都是需要打印字符, 如Ctrl、Shift、大写锁定键、Esc键等);所以,我们又将打印字符的代码抽取为 in_process ()函数, 在in_process()函数中,依据扫描码判断键入的字符是否需要打印;(具体代码调用如下图所示)
os如何处理键盘的所有按键,显示or不显示,显示是如何显示
os如何处理键盘的所有按键,显示or不显示,显示是如何显示的更多相关文章
- OS X 键盘快捷键
了解有关常见 OS X 键盘快捷键的信息.键盘快捷键是通过按下键盘上的组合键来调用 OS X 功能的一种方式. 若要使用键盘快捷键或按键组合,您可以同时按修饰键和字符键.例如,同时按下 Command ...
- MacBook键盘锁定、按键失效、无反应等问题
目录 MacBook按键无反应 u,i,o,j,k,l等键失灵 capslock灯不亮 原文链接:joselynzhao·CSDN·MacBook键盘锁定.按键失效.无反应等问题 MacBook按键无 ...
- 《连载 | 物联网框架ServerSuperIO教程》- 13.自定义视图显示接口开发,满足不同的显示需求
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- Java基础-多线程编程-1.随便选择两个城市作为预选旅游目标。实现两个独立的线程分别显示10次城市名,每次显示后休眠一段随机时间(1000ms以内),哪个先显示完毕,就决定去哪个城市。分别用Runnable接口和Thread类实现。
1.随便选择两个城市作为预选旅游目标.实现两个独立的线程分别显示10次城市名,每次显示后休眠一段随机时间(1000ms以内),哪个先显示完毕,就决定去哪个城市.分别用Runnable接口和Thread ...
- java显示本地磁盘所有盘符,显示桌面路径
import java.io.File; import javax.swing.filechooser.FileSystemView; /** 显示本地磁盘根盘符,显示桌面路径 */ public c ...
- ajax导致Echarts不显示饼图数据、柱状图数据只显示气泡的问题。
1.ajax导致Echarts不显示饼图数据.柱状图数据只显示气泡的问题. ajax的同步.这个同步的意思是当JS代码加载到当前ajax的时候会把页面里所有的代码停止加载,页面出去假死状态,当这个aj ...
- 百度地图api在Html中显示,在jsp页面中不显示解决方法
在jsp页面中显示如下 但是在html中正常显示. 原来的代码如下: <script type="text/javascript" src="http://api. ...
- swiper默认显示三个,中间放大且显示全部图片两边显示部分图片的实现方法
本页面内容最后的红色部分有惊喜哦! 最近在做一个活动页面,要求触摸切换图片时,默认在可视区域中显示三张图片,其中中间的一张图片比其他两张都大且全部显示,而其他两张图片只显示部分即可,于是就想到了swi ...
- DIV内容超出长度显示省略号,鼠标移上自动显示全部内容(EasyUI DataGrid)
如果想把DIV中超出的文本显示成省略号,而不是换行全部显示,有2个办法. 注:本文主要是以EasyUI的DataGrid为案例的,如果是其他场景只要底层是用DIV显示文本的应该都能使用. 首先可以给此 ...
随机推荐
- 【传输文件】文件传输协议FTP、SFTP和SCP
网络通信协议分层 应用层: HTTP(Hypertext Transfer Protocol 超文本传输协议,显示网页) DNS(Domain Name System) FTP(File Transf ...
- bzoj 1031 [JSOI2007]字符加密Cipher 后缀数组模板
题目链接 题目描述 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法 :把需要加密的信息排成一圈,显然,它们有很多种不同的读法.例如下图,可以读作: ...
- [Visual Studio] 确定项目是用Visual Studio哪个版本开发的
用记事本打开 .sln文件,在第3行就有:
- python进阶学习
python高级用法 github: https://github.com/cq146637/Advanced
- 七、Ubuntu 关机或者重启
重启命令:1.reboot2.shutdown -r now 立刻重启(root用户使用)3.shutdown -r 10 过10分钟自动重启(root用户使用)4.shutdown -r 20:35 ...
- DB2数据库报 [SQL0805N Package "NULLID.SQLLD003" was not found.]
解决办法: cd /home/db2inst1/sqllib/bnddb2 bind @db2cli.lst blocking all grant public sqlerror continue C ...
- Sharing Cookies --AtCoder
题目描述 Snuke is giving cookies to his three goats.He has two cookie tins. One contains A cookies, and ...
- 【hash】什么是hash,什么是哈希,什么是hash散列,什么是hash一致性算法【关于hash的详解】
什么是hash,什么是哈希,什么是hash散列,什么是hash一致性算法
- Fresco对Listview等快速滑动时停止加载
Fresco中在listview之类的快速滑动时停止加载,滑动停止后恢复加载: 1.设置图片请求是否开启 // 暂停图片请求 public static void imagePause() { Fre ...
- 最短路算法之 Dijkstra算法
Dijkstra算法 Dijkstra算法是典型最短路算法,用于计算一个节点到其它全部节点的最短路径. 主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法能得出最短路径的最 ...