30天自制操作系统——Day7实验报告

一、实验主要内容
1、 内容1:获得按键编码
重点总结:改善程序,让程序在按下一个键后不结束,而是把按键的编码显示出来
(1)int.c
30天自制操作系统——Day7实验报告_第1张图片
1、 函数功能
检测键盘IRQ1是否发生中断,发生中断后接受按键编码并在屏幕上输出
2、 Io_out8(PIC0_OCW2, 0x61)
1.功能通知PIC已经捕获了IRQ1的中断。
2.可以将0x61修改为0x61~0x6e,将对应的IRQ号码输出给OCW2
3.执行这句话后,PIC继续监视IRQ1中断是否发生。
(这句话是连续感知中断的关键)
3、 io_in8(PORT_KEYDAT)
1.从编号为0x0060的设备输入的8位信息是按键编码。编号为0x0060的设备就是键盘。
(2)结果
30天自制操作系统——Day7实验报告_第2张图片
工作总结:设定了键盘中断检测,并将输入按键的编码输出

2、 内容2: 加快中断处理
重点总结:上述程序有一个问题,就是字符显示的内容放在了中断处理程序中。字符显示会花大块时间进行处理,如果处理键盘的中断速度太慢,就会出现不连贯或不响应的问题,这是我们不希望看见的。于是先将按键编码接受保存在变量中,然后又HariMain偶尔查看变量。
(1)init.c
30天自制操作系统——Day7实验报告_第3张图片
键盘输入时需要缓冲区,因此定义了一个结构体,当缓冲区为空时(flag == 0)保存数据。当缓冲区满时,只能丢弃获得的数据
(2)bootpack.c
30天自制操作系统——Day7实验报告_第4张图片
1、函数功能
读取缓冲区数据,若缓冲区为空则进入stihlt(),即进入休眠,当收到PIC通知后CPU被唤醒。若缓冲区不为空,则读取缓冲区数据并清理缓冲区
2、屏蔽中断与恢复中断
在执行中断后的步骤前,需先屏蔽中断io_cli()。完成数据读取后恢复中断io_sti()。在保存完缓冲区数据后,虽然恢复中断可能会造成混乱,但并不会影响读取的数据。
(3)结论
30天自制操作系统——Day7实验报告_第5张图片
尝试按下右Ctrl键后,屏幕仅显示E0
因为按下右Ctrl键会产生两个字节的数据“E0 1D”,且缓冲区只能保存一个字节的数据,因此1D会被舍弃
工作总结:将字符串显示功能搬出中断处理函数,减少中断过程中可能产生的遗漏情况

3、 内容3: 制作FIFO缓冲区
重点总结:之前所创建的缓冲区只能存储一个字节的数据,因此我们需要一个能够存储多个字节的缓冲区
(1)init.c
30天自制操作系统——Day7实验报告_第6张图片
30天自制操作系统——Day7实验报告_第7张图片
1、函数功能
当下一存储位置next < 32时(缓冲区当前未满时),将按键数据存储在缓冲区next位置,并将next后移1位(next+1)
(2)bootpack.c
30天自制操作系统——Day7实验报告_第8张图片
1、 函数功能
当缓冲区不为空时,读出队首元素。
2、实现细节
通过数组实现队列FIFO,读出队首数据data[0],然后将1 → \to next-1的数据分别赋值给0~next-2。但在禁止中断的期间里做数据移动是有问题的!
工作总结:实现了缓冲区队列保存多字节数据

4、 内容4: 改善FIFO缓冲区
重点总结:因为在禁止中断期间做数据移送有问题,因此尝试开发一个不需要数据移送操作的缓冲区。这种方法是不仅维护下一个要写入数据的位置,还要维护下一个要读出数据的位置。
(1)init.c
在这里插入图片描述
30天自制操作系统——Day7实验报告_第9张图片
开发不需要数据移送操作的缓冲区。这种方法是不仅维护下一个要写入数据的位置,还要维护下一个要读出数据的位置。 当写入位置=读出位置时,缓冲区为空,当写入、读出位置到达缓冲区上限时,强制置零
1、 函数功能:
保存按键编码,将编码保存在写入位置next_w位置处,随后写入位置后移。当next_w到达上限时,强制置零

(2)bootpack.c
30天自制操作系统——Day7实验报告_第10张图片
1、函数功能:
当缓冲区非空时,读出缓冲区在下一读出数据位置next_r处的数据,随后读出位置后移。当next_r到达上限时,强制置零。
工作总结:优化缓冲区结构,实现无数据移送操作的数据读取

5、 内容5: 整理FIFO缓冲区
重点总结:整理FIFO缓冲区,让它具有通用性
(1)bootpack.h
在这里插入图片描述
1、 函数功能
定义了FIFO8结构体当作缓冲区。
其中,buf表示缓冲区地址,p, q表示下一个写入和读出位置,size表示缓冲区的大小,free表示缓冲区中空余字节数,flag表示缓冲区当前是否填满

(2)fifo.c
30天自制操作系统——Day7实验报告_第11张图片
1、函数功能
初始化缓冲区,给吹缓冲区的起始地址与大小。并为其他变量赋初值
30天自制操作系统——Day7实验报告_第12张图片
1、函数功能
数据写入缓冲区,当缓冲区剩余空间为空时,标记flag并返回-1异常。否则,存放在下一可存位置,并更新下一写入位置和剩余空间
30天自制操作系统——Day7实验报告_第13张图片
1、 函数功能
从缓冲区读取数据,当缓冲区为空时,返回值为-1.否则,读取下一读出位置数据,并更新下一读出位置和剩余空间

30天自制操作系统——Day7实验报告_第14张图片
1、函数功能
返回缓冲区当前存储的数据数量

2、 函数实现细节
a. 设置PIC前后中断禁止设置
为了放置在对中断设定进行更改时,如果没有连接任何设备的话,再接受别的中断会引起混乱。因此再设置前禁止所有中断,设置后,开启IQR2的中断
b. 设置主-从相连位置:
主PIC通过IQR2与从PIC相连,而对于主PIC而言,是用8位设定的,对从PIC而言,使用3位设定的。因此分别设置为 0000 0100与2

6、 内容6:总算讲到鼠标了
重点总结:虽然在主板上做了鼠标用的电路,但只要不执行激活鼠标的指令,就不会产生鼠标的中断信号。因此我们需要发行指令,让鼠标控制电路与鼠标本身有效。
(1)bootpack.c
① wait_KBC_sendready
在这里插入图片描述
30天自制操作系统——Day7实验报告_第15张图片
1、函数功能
让键盘控制电路做好准备,等待控制指令的到。如果键盘控制电路可以接受CPU指令了,CPU从设备号码0x0064处所读取的数据的倒数第二位应该是0。 在确认该位为0前,程序一直通过for语句循环查询。
2、函数意图:
CPU的电路比键盘控制电路快很多,如果不断发送指令,有些指令就会得不到执行

② init_keyboard
在这里插入图片描述
在这里插入图片描述
30天自制操作系统——Day7实验报告_第16张图片
1、函数功能
一边通过wait_KBC_sendready确认是否往键盘控制电路传送信息,一边发送模式设置指令io_out。模式设定的指令是0x60,利用鼠标模式的模式号码是0x47。使鼠标控制电路准备完成。

③ enable_mouse()
30天自制操作系统——Day7实验报告_第17张图片

1、 函数功能
与init_keyboard非常相似,不同仅在写入的数据不同。如果往键盘控制电路发送指令0xd4(KEYCMD_SENDTO_MOUSE),下一个数据会自动发送给鼠标。
(2) 结果
30天自制操作系统——Day7实验报告_第18张图片

7、 内容7:从鼠标接收数据
重点总结:取出鼠标的中断数据
(1)int.c
30天自制操作系统——Day7实验报告_第19张图片
1、 函数功能
要向PIC发送中断受理通知。IRQ-12使从PIC的第4号,从PIC与主PIC的第2号相连

【从鼠标、键盘获取数据】
30天自制操作系统——Day7实验报告_第20张图片
1、 函数功能
从鼠标取得数据的方法与键盘完全相同。判断是哪个设备传来的数据,需要通过中断号码区分。如果键盘和鼠标FIFO缓冲区都为空,就执行HLT。否则,先检查keyinfo,如果有数据就显示出来。再检查mouseinfo,如果有数据,也显示出来

(2)结果
30天自制操作系统——Day7实验报告_第21张图片
滚动鼠标和键盘,显示出各种各样的数字

二、遇到的问题及解决方法
填写说明:分条目列出本次的实验过程中遇到的问题和解决方法(可注明是哪位同学帮忙解决问题),描述问题时应配上相关的截图和标记,描述解决方法时应先分析出现该问题的原因再讲解决方法,尽量详细。
1、 描述问题1:为什么需要设置PIC前后中断禁止设置
为了放置在对中断设定进行更改时,如果没有连接任何设备的话,再接受别的中断会引起混乱。因此再设置前禁止所有中断,设置后,开启IQR2的中断

三、程序设计创新点
填写说明:分条目列出本次实验过程中对教材的哪些部分进行了创新或者修改,写清楚为什么要这样做,这么做会得到怎样的结果等,附上关键代码和截图。这部分是重点,占实验日志总分的20%。
1、 描述创新点1,实现一个实心圆,键盘上、下、左、右四个方向键控制圆形移动的方向
(1) 实现方法
读取键盘输入的按键编码,当编码为0x48, 0x50, 0x4B, 0x4D(分别标识上、下、左、右方向键)时,向指定的方向移动gap距离,并在屏幕上显示当前圆心坐标的位置。
(2) 如何实现图形的迁移
图形的上下迁移涉及两个步骤,首先是覆盖:将原位置图形的颜色填充为背景色。
接着画图,在移动的位置画出新的图形。数字坐标的显示方法同理。
(3) 注意
当实心圆与边界的距离小于移动距离gap时,将会在屏幕上显示“It has reached the boundary”信息,并且自动平移到与边界相切位置处。
30天自制操作系统——Day7实验报告_第22张图片

2、 描述创新点2,改变实心圆的移动步长
在创新点1中,我们设定实心圆每次只能向对应方向移动gap距离,现在我们设定按键使实心圆能切换5、10、20的间距移动。
(1) 实现方法
将移动步长设置为gap变量,初始化为10.当按下按键F1使,gap = 5。按下按键1,2分别标识gap=10, gap=20
30天自制操作系统——Day7实验报告_第23张图片
2、 描述创新点3,实心圆改变为圆环
通过改变圆的生成算法,生成不同的图像,然后按下空格键切换

3、 描述创新点4,记录位置并随时返回
实现位置标记,移动到其他位置后,可以根据之前记录的位置信息移动到该位置
(1) 实现方法
记录想要标记点的坐标位置,记录再record变量中。移动到其他位置后,可以返回记录位置。 通过覆盖原有位置,然后在标记位置生成相同图像即可实现
30天自制操作系统——Day7实验报告_第24张图片

四、实验心得体会
填写说明:写本次实验的心得体会,例如:学到了什么、思考了什么、有何建议、解决问题的过程是怎样的等等(根据个人实验情况填写,内容没有硬性要求)。
1、屏蔽中断与恢复中断
在执行中断后的步骤前,需先屏蔽中断io_cli()。完成数据读取后恢复中断io_sti()。在保存完缓冲区数据后,虽然恢复中断可能会造成混乱,但并不会影响读取的数据。
2、 函数实现细节
c. 设置PIC前后中断禁止设置
为了放置在对中断设定进行更改时,如果没有连接任何设备的话,再接受别的中断会引起混乱。因此再设置前禁止所有中断,设置后,开启IQR2的中断
d. 设置主-从相连位置:
主PIC通过IQR2与从PIC相连,而对于主PIC而言,是用8位设定的,对从PIC而言,使用3位设定的。因此分别设置为 0000 0100与2

你可能感兴趣的:(30天自制操作系统,操作系统)