第13天:定时器

1、内容1:简化字符串显示,a文件夹

将类似于这种三步操作:
1)涂上背景色
2)在上面写字符
3)完成刷新
因为bootpack.c中出现了很多次如下代码,因此可以制作一个显示函数来使得bootpack.c中的内容进一步的简化,使得这个功能更更方便使用。

改写函数:

X、y是显示位置的坐标,c是字符颜色,b是背景颜色,s是字符串,l是字符串的长度。这样改写之后,虽然缩短了两行,但还是缩短了,挺好的。

2、内容2:重新调整FIFO缓冲区(1)b文件夹

在前一天中,所使用的定时器都是各占一个FIFO缓冲区,但是一个定时器可以不需要一个FIFO缓冲区,多个定时器可以用一个FIFO缓冲区。
修改代码如下:

可以看到,三个定时器共用了一个FIFO缓冲区,除此以外,修改if语句,使得程序更加精简。

3、内容3:测试性能,c文件夹

之前已经对程序不断的做了相应的改善,但如果想要知道程序究竟改善到了什么样的程度的话,还需要测试其性能。
先对HariMain进行一定的修改,恢复变量count,然后完全不显示计数,全力执行count++语句。当到了10秒后超时的时候,再显示这个count值。
在进入循环的时候添加count++,完全不显示计数,到了10秒后超时的时候再显示这个count值,在启动3秒的时候把count复位为0。这里的原理是用定时器计时到10秒输出循环的次数,但是每次要做中断处理(鼠标键盘)都会占用时间,那么循环的次数就会因此变小,越小说明处理的时间越长,这不是我们想要的。因为我们做的这个操作系统启动(初始化)的时候只要有些条件发生了变化,电脑花费的时间就会不稳定,这就导致开始的时间存在误差,所以统一在3秒后复位,保证时间统一开始。
修改程序如下:


运行后的结果如下:

需要注意的是,在测试的10秒内,不要动鼠标或者按键,因为如果触碰到了鼠标或者按键的话,那么程序就需要进行光标的显示处理,这样会减缓count的增长。5次的结果相差比较大,为什么会这样呢,是因为使用了模拟器而收到了windows的影响。根据以上趋势,每次优化之后count的值会变大,count的值越大说明每次的性能变好。
真机显示的数值收敛的很好,但还是出现了一定的误差,是因为电脑内部的温度变化或时钟频率的微妙变化。但是在我的电脑上面,是无法用make install出结果的,因为系统的不兼容。

除此以外,需要在启动3秒后,将count重置为0,是因为,如果不这样做的话,在真机的指定过程中,只要某些条件稍微有些变化,电脑初始化所花费的时间就会有很大的变化。因此在一开始的几秒内,不进行计数,这样便可以减去开始时的误差了。

4、内容4:重新调整FIFO缓冲区(2),g文件夹

在前面的内容中,已经能够把3个定时器归纳到一个FIFO缓冲区里,那么同样的道理,键盘和鼠标都可以归纳起来,用一个FIFO缓冲区进行管理。
代码如下:

同时因为存储数据的范围扩大,没有修改之前的FIFO参数类型为Char,最大只能达到256,对鼠标这种767的数值就不能指定,所以要修改FIFO中的参数类型(修改为int型以前的8位变成32位),只能将参数改为int型。

只需要简单的将char改为int即可。

初始化修改(实际上只修改了函数名和参数类型buf):

之后对键盘和鼠标的相关程序进行修改,不再使用FIFO8,而是使用FIFO32。


同时修改定时器的结构体,使得其也能使用FIFO32。

经过这样的修改之后,程序又再次简化,减少了8行。
因为在这次的修改之后,FIFO缓冲区的查询能够更快的完成,从而使得count++语句执行的次数更加的多了。这次的改善定时器处理还是一样的原理,但是在主函数里我们修改了只查询一个缓冲区,在没有修改之前我们要多次进行查询,所以这次要加速完成查询,使得“count++”在相同的时间内,执行的次数更多。

5、内容5:加快中断处理(4),h文件夹

虽然之前已经对中断处理进行了改良,但还是远远不够的,因为timer_settime虽然不是中断处理程序,但是依然是在中断禁止期间进行的,因此要快速的完成。现在使用的定时器比较少,只有3个,但如果任务增加,并且同时进行,需要更加多的定时器,并且还需要使用移位处理,这样便浪费了时间。
在FIFO中有一个取代移位处理的方法,便是在读取一个数据以后不让后面的数据向前靠齐,而是改变下一次的数据读取地址,虽然这个方法不错,但不适用于定时器。因为用timer_settime登陆中断时,后面的中断必须后移。
因此,采用另一种方法,加入一个next指针,其是一个地址变量,用来存放下一个即将超时的定时器的地址。

Next表示下一个即将超时的定时器地址,图示如下:

按照这样的结构,修改定时器的中断处理程序。修改定时器的中断处理程序(只改写timers[0]):


和以前不一样的是,对于timer[]数组来说,出了timer[0]以外其他都是完全没用的。如果不需要超时处理的话,也就没必要认真的去做移位处理,因此在移位处理中只改写timers[0]。
修改timer_settimer函数:


一共有4种情况,当运行的定时器只有一个时,那么就将next指向结束时的定时。如果插入的定时器的定时比之后的都要小,就将其放在第一个,如果是在两个中间的话,那么就如下图所示:

仅仅改变s->next和timer->next即可,这样就不需要进行移位了,就算使用很多的定时器,速度也不会变慢。如果最后的情况,直接将next赋为0即可。
变量t是从头开始对timers[]进行遍历用的,而s用来保存前一个t值。其实整个的timers[]已经不需要了,不过并不是全都不要,只需要最前面的timers[0]即可。

6、内容6:使用“哨兵”简化程序,i文件夹

使用哨兵简化程序,首先timer.c在去除移位处理后,其中的timer_settime函数还是比较繁琐的,就需要简化该程序。之前是按照4中可能来进行分类处理的。

在进行初始化的时候,将时刻0xffffffff的定时器连到最后一个定时器上。但其实无论如何都不可能到达这个时刻,因此不会发生超时问题,它一直处在后面,便是所谓的哨兵。将哨兵加入到程序中,

如果使用需要调整的程序(一年调整一次)必须保证不改变哨兵时刻,哨兵的时刻调整:

因为加入了所谓的哨兵,settime的状况便发生了变化,只剩下两种情况会发生。

因此程序便可以简化:


将程序修改到这样的情况后,Using便失去了它的用处,之前它是对运行中的定时器进行计数,那时候还是用数组timers[],其帮主记录timers[]已经被使用到了哪个位置,但在不使用数据timers[]之后,现在又有了哨兵的情况下,便不会出现Using为0的情况,至少还有1个,因此便可以删去Using了。这样程序更加的简化了。

30天自制操作系统(day13)相关推荐

  1. 为什么《30天自制操作系统》封面中的猫是两只尾巴

    刚刚在一社区,发了一贴,被指出一问题,询一高人,得一答案.这便是我没有关注到的封面上的那只猫,我想这也是很多读者没有关注到的.因为在我微博的200转发贴中,并没有人提到封面中的猫为何有两只尾巴.于是咨 ...

  2. 发布在《30天自制操作系统》之前的帮助阅读贴

    说明:这是8月15日即将上市的一本新书,本文的摘选也可以命名为<30天自制操作系统>上市之前必读.本书幽默,有趣,可以说是技术书里的幽默书,让您读起来绝对不会感到乏味.在本书上市之前,您一 ...

  3. 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!

    <30天自制操作系统>笔记(01)--hello bitzhuwei's OS! 最初的OS代码 1 ; hello-os 2 ; TAB=4 3 4 ORG 0x7c00 ; 指明程序的 ...

  4. 写在《30天自制操作系统》上市之前

       这本<30天自制操作系统>马上就要在各大书店和网上商城全面上架了,作为本书的4位译者之一,我负责翻译了本书约三分之二的内容.这是我参与翻译的第一本译著,我感到很激动也很紧张,因为我知 ...

  5. 《30天自制操作系统》笔记(04)——显示器256色

    <30天自制操作系统>笔记(04)--显示器256色 进度回顾 从最开始的(01)篇到上一篇为止,已经解决了开发环境问题和OS项目的顶层设计问题. 本篇做一个小练习:设置显卡显示256色. ...

  6. 《30天自制操作系统》学习笔记--第好多天

    之前看<30天自制操作系统>,参考而成,和书中系统并不完全一致,是在原有基础上按照自己的习惯而成,由于水平和工作原因,未完成内存管理和文件系统,有兴趣者可以通过以下网址https://gi ...

  7. 由《30天自制操作系统》引发的漫画创作

    大家可还记得<30天自制操作系统>的封面上的那只猫吗?记得当时,在果壳网有人问,为何这只猫长了两只尾巴呢,延着这条线,我把这本书捧上了展示的舞台.事隔四个多月,我又重提此书. 这本经我手宣 ...

  8. 30天自制操作系统——第二十三天窗口操作

    窗口及输入切换 我们先来实现用键盘切换窗口,按下F11键,将最下面的窗口移动到最上面,这里F11按键的编码为0x57. bootpack.c节选: void HariMain(void) {(略)fo ...

  9. 30天自制操作系统-初体验

    最近在图书馆翻阅关于操作系统的书籍,看到川和秀实的自制操作系统决定也动手尝试一下,这本书书名就叫做30天自制操作系统.首先还是附上光盘镜像的获取地址吧.30天自制操作系统光盘镜像ISO完整版下载 - ...

  10. 《30天自制操作系统》---第一天

    <30天自制操作系统>---第一天 二进制编译与文本编译器大家用自己顺手的就可以,今天通过两种方法运行虚拟机,第一种通过作者提供的工具运行在QEMU中,第二种方法运行到VMWare中,直接 ...

最新文章

  1. 2016年第七届蓝桥杯决赛Java本科B组试题解析
  2. JAVA中console方法怎么用_Java中Console对象实例代码
  3. Netflow/IPFIX 流量收集与分析
  4. iOS扩大按钮的点击范围
  5. Linux 命令平时积累
  6. 马斯克:全力支持狗狗币主要持有者出售货币 持仓太集中是问题
  7. iOS---UIScrollView实现相册循环
  8. Hadoop 源代码分析(二三)FSDirectory
  9. 小D课堂 - 新版本微服务springcloud+Docker教程_6-01 微服务网关介绍和使用场景
  10. 老司机和你深聊Kubenertes 资源分配之 Request 和 Limit 解析
  11. [IE编程] IE8的SDK 下载
  12. 后911S5时代 各路ip代理的对比与选择 (仅供参考)
  13. 2020年6月六级作文和翻译三国演义
  14. 阿里视频直播自定义推拉流地址生成
  15. 【泛函分析】巴拿赫空间
  16. Date类和Calander类
  17. vue中的路由跳转和传参
  18. OSPF多区域与配置
  19. 我用维权失败经历告诉你,在淘宝上买到假货只能忍气吞声
  20. jsp物流信息发布管理平台

热门文章

  1. 3D目标检测 | PointPillars论文和代码解析
  2. 3-AT命令交互之-PIN码
  3. 和我一起学 Selenium WebDriver(1)——入门篇
  4. 耳机对耳朵影响有多大?骨传导耳机对耳朵的影响是最小的吗?
  5. VS2013配置Boost.Asio环境
  6. 阿甘修理机器人cd_剑网三遗失的美好兑换哪个好?遗失的美好兑换攻略
  7. 甜橙金融互联网金融科技论坛:PingCAP 余梦杰谈 5G 时代机遇与挑战
  8. 改变世界的9大算法--PageRank
  9. go vs java基准测试_你如何使用go(golang)gocheck测试框架的基准标志?
  10. 爱奇艺下载的QSV格式视频如何转换成MP3音频