挑战30天写操作系统-day7-FIFO与鼠标控制

目录

在这里插入图片描述
微信关注《猿小龙》获取源码和电子版书籍

今日成果

在这里插入图片描述

1.获取按键编码(hiarib04a)

上次鼠标不能移动的主要原因是设定不到位。
我们需要做的就是让程序按下一个键后不结束,而是把所有键的编码显示出来,这样就算是完成了中断处理程序
在这里插入图片描述
"io-out8(PIC0_ocw2,0x61)”用来通知PIC已经知道发生了IRQ1中断哦。如果是IRQ3,则写成0x63。也就是说将0x60+IRQ号码输出给OCW2即可。执行完这句话后,PIC继续时刻监视IRQ1是否中断在这里插入图片描述
,否则系统将感知不到。
从编号为0x0060的输入的设备8位信息是按键编码,它就是键盘
在这里插入图片描述
计算机不但知道按下什么键了,并且知道松开了什么键。

2.加快中断处理(hiarib04b)

这里有一个问题就是字符显示的内容被放在了中断处理程序中。
如果处理键盘的中断速度太慢,就会出现鼠标的运动不连贯,不能从网上接受数据等
字符显示也需要花费大量的时间的处理。仅仅画一个字符就要执行128次if语句,来判定是否往VRAM中描画该像素,还要执行内存写入指令。而且往内存的哪个地方写,还要进行地址计算。
解决方案:就是先将那件的编码接受下来,保存到变量里,然后有HariMain偶尔去查看这个变量,如果发现有了数据,就把它显示出来。
在这里插入图片描述
考虑到剪短输入需要缓冲区,我们定义一个结构体,命名为keybuf,其中的flag变量用于表示该缓冲区是否为空,如果缓冲区中有数据,而这时来了一个中断,那该怎么办呢,这没办法,需要扔掉。
在这里插入图片描述
HariMain函数中首先先用io_cli指令屏蔽中断,为什么要屏蔽中断呢?因为在后面的处理中,如果有中断进来,将会造成混乱,需要先屏蔽中断,然后看一看keybuf.flag的值是什么
如果为0,说明按键没有被按下,keybuf.data中没有值保存进来,在keybuf.data里有值被保存进来之前,先进行屏蔽。这样,即使执行HLT指令,同时有有什么按键被按下,程序也不会有任何反应。所以STI和HLT指令都要执行,而执行这两个指令的函数是io_stihlt,执行完HLT指令之后,如果收到了PIC的通知,CPU将会被唤醒,这样,CPU首先是处理中断程序。中断程序执行完之后,又回到for语句开头,再执行io_lci函数
当按键按下时,keybuf.data中有了数据,存入了按键编码,先将这个按键编码值保存的变量i里面,然后将flag清空,最后再使用io_sti语句放开中断。最后,放开中断后,就可以显示字符了。

3.制作FIFO缓冲区(hiarib04c)

前边程序只能存储一个字节
在这里插入图片描述
输入ABC,需要输出ABC,而不是CBA,所以需要制作栈
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果next不是0,则说明至少有一个数据,最开始的一个数据肯定是放在data[0]中的。
在这里插入图片描述
全部往前挪
实现了一个栈的数据结构,但是该种实现方式不尽人意,最坏效率需要挪动所有数据

4.优化FIFO缓冲区(hiarib04d)

优化思路是采用两个下标指针,而不需要对数本身进行移动,移动的是下标,当两个下标相等时,就是数据为空了。
在这里插入图片描述
但是还是有问题
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.整理FIFO缓冲区(hiarib04e)

鼠标的移动是类似的,只不过数据量较多
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.鼠标(hiarib04f)

在这里插入图片描述
S
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.从鼠标接受数据(hiarib04g)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是C语言实现存储管理中的FIFO算法和LRU算法的代码示例: FIFO算法: ```c #include <stdio.h> #define MAXSIZE 3 int main() { int pages[MAXSIZE], frames[MAXSIZE], temp[MAXSIZE]; int i, j, k, page_faults = 0, flag = 0, pos = 0; printf("Enter the reference string: "); for(i = 0; i < MAXSIZE; ++i){ scanf("%d", &pages[i]); } for(i = 0; i < MAXSIZE; ++i){ frames[i] = -1; } for(i = 0; i < MAXSIZE; ++i){ flag = 0; for(j = 0; j < MAXSIZE; ++j){ if(frames[j] == pages[i]){ flag = 1; break; } } if(flag == 0){ frames[pos] = pages[i]; pos = (pos + 1) % MAXSIZE; ++page_faults; } printf("\n"); for(j = 0; j < MAXSIZE; ++j){ printf("%d\t", frames[j]); } } printf("\nTotal page faults: %d", page_faults); return 0; } ``` LRU算法: ```c #include <stdio.h> #define MAXSIZE 3 int main() { int pages[MAXSIZE], frames[MAXSIZE], temp[MAXSIZE]; int i, j, k, page_faults = 0, flag = 0, pos = 0, max, min; printf("Enter the reference string: "); for(i = 0; i < MAXSIZE; ++i){ scanf("%d", &pages[i]); } for(i = 0; i < MAXSIZE; ++i){ frames[i] = -1; } for(i = 0; i < MAXSIZE; ++i){ flag = 0; for(j = 0; j < MAXSIZE; ++j){ if(frames[j] == pages[i]){ flag = 1; break; } } if(flag == 0){ for(j = 0; j < MAXSIZE; ++j){ temp[j] = 0; for(k = i - 1; k >= 0; --k){ if(frames[j] == pages[k]){ temp[j] = 1; break; } } } flag = 0; for(j = 0; j < MAXSIZE; ++j){ if(temp[j] == 0){ pos = j; flag = 1; break; } } if(flag == 0){ max = temp[0]; pos = 0; for(j = 1; j < MAXSIZE; ++j){ if(temp[j] > max){ max = temp[j]; pos = j; } } } frames[pos] = pages[i]; ++page_faults; } printf("\n"); for(j = 0; j < MAXSIZE; ++j){ printf("%d\t", frames[j]); } } printf("\nTotal page faults: %d", page_faults); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值