文章目录

  • 理解
  • 原理
  • 定时器优化
    • 改为判断
    • 增加next
    • 增加排序数组
    • 合并FIFO
    • 使用链表
    • 测试性能
  • 技巧
  • 多任务
    • 基础版本
    • 升级版本

理解

  • 在叠加图层系统和定时器系统里面可以看到作者的很多优化思路
  • 对于这些优化思路,我们都是可以借鉴的

原理

  • 通过每隔一定的时间间隔向CPU发送中断,然后我们绑定了该中断所对应的计时函数,即每发生一次中断,该函数加1,并且判断所有的定时器,是否超过了该时间【超过了就需要执行该定时器的操作】,超过了就将定时器里面的数据放入FIFO里面,然后我们在主程序里面判断FIFO里面是否有数据,有数据就取出来,然后根据取出的数据来执行各种预先定义好的操作

  • 这个预先定义好的操作里面,我们可以去设置一个同样时间间隔的定时器,循环执行这个操作

  • 我们是通过PIT(programmable Interval Timmer) 可编程的间隔型定时器,因为在电脑中PIT连接着IRQ【interrupt request】 0号,所以只要设定了PIT就可以设定IRQ0的中断间隔,PIT是一个独立的芯片,但是现在已经和PIT一样被集成到了别的芯片里面。

  • PIT自身有一些寄存器,这些寄存器本身都是8位的,与端口号相对应,在设置的时候指明对应的端口号进行读写

    • IMR是中断屏蔽寄存器,哪一位是1就屏蔽哪一个中断信号
    • ICW1和ICW4是硬件相关的ICW3也是固定的
    • 只有ICW2是自由配置的,它决定了IRQ以哪一号中断来通知CPU
    • CPU收到中断以后,判断可以处理,就会命令PIC发送一个2字节的数据,CPU把数据当做指令执行,该数据是0x CD ?? ,就是INT ??的机器码
    • INT 0x20~0x2f接收中断信号IRQ0 ~15而设定,至于不直接用INT 0x00 ~0x0f,是因为这些号码被用来CPU的内部保护中断处理了。
    • IDT是中断记录表,他决定了CPU当接收到对应的中断号时,执行哪一个函数。IDT记录了0-255的中断号码与调用函数的对应关系。
    • 当CPU执行中断的时候,他需要首先保存当前的工作环境,然后去执行中断函数,最后再还原工作环境,继续当前的程序执行。因此在我们的中断函数里面,首先需要将寄存器的值全部存入栈中,然后调用对应的中断函数,最后再从栈中取出数据放置到寄存器中
    • 因此对应的中断函数,都分为两个部分,一是汇编部分,二是C语言部分,汇编部分入栈,调用C语言函数,然后出栈。

定时器优化

  • 我们要尽可能的减少CPU处理中断时所消耗的时间,否则会导致卡顿
  • 【比如,你正在打字,然后突然计时中断发生了,那么你的打字就会卡在那里,如果这个计时中断绑定的函数执行很快,只有大约0.1s左右,那么你就几乎感受不到这个停顿】
改为判断
  • 一开始的操作是每个计时器记录一个时间变量timeout,然后每次中断,对于所有的定时器进行遍历timeout - -,如果该timeout<=0,那么就说明时间到达了,将数据写入FIFO。
  • 可是 timerctl.timer[i].timeout-- 这个操作要完成从内存中读取变量值,减去1,然后又往内存中写入的操作。
  • 所以我们把timeout改为count+设定时间,意义是从当前时间开始多少秒后,这样就只用执行一个判断语句即可
增加next
  • 在定时器中断处理函数当中,有一个for循环遍历定时器,然后有两个if语句,首先判断该定时器是可用的,其次判断是否超时
  • 每次中断会执行500次if语句,然后1秒会中断100次,这样导致的结果就是该if语句每秒要执行5万次,【完全可以简化】
  • 我们增加一个next变量来指示下一次最接近timeout,因此count只需要和他进行判断即可,如果count<next,直接return,否则就进行遍历,将超时的全部执行,然后继续筛选出新的next,下一个最接近的时间点
  • 这样在大部分时间情况下都会return
增加排序数组
  • 增加一个存储定时器地址的数组,将数组里面按计时的timeout大小进行排序
  • 然后每次count<next的时候,就遍历该有序数组有多少个超时了,然后写入FIFO
  • 继而将有序数组后面的定时器往前排。有序数组中存放的都是活跃数组。
  • 然后设置定时器的时候,也需要放置到有序数组的合适位置。
  • 由于在设定定时器的时候需要禁止中断。
合并FIFO
  • 该程序之前分为好几个FIFO缓冲区,在for循环里面,查询缓冲区和count++是交替进行的
  • 如果原先需要查询3个缓冲区,现在只需要查询一个,所以会加快count的运行
使用链表
  • 以前的程序是使用数组,这样为了维持数组的有序,每次插入新的定时器,都需要重新移动数组元素。
  • 当执行计时器中断程序的时候,直接重置头指针即可
  • 简单来说,把原来存放活动定时器地址的数组设定成链表的形式。
  • 这样当插入新的定时器的时候,会导致有四种情况
    1. 插入到最前面
    2. 插入到中间
    3. 插入到最后面
    4. 只有一个元素
  • 岗哨,我们设置一个时间为0xffff,然后就会一直放置到链表的末尾
  • 这样就会消除34两种情况
测试性能
  • 在HariMain里面累加Count,查看10s时候的count值,在开机启动3s之后要重置count为0
  • 因为电脑在启动时候的偏差会很大,所以在前3s的count值舍弃掉

技巧

  • 在FIFO里面取代移位操作,读取一个数据以后不是让后面的数据向前靠齐,而是改变下一次的数据读取地址。但是并不适用于定时器。

多任务

  • 对于多任务而言,是有两片内存区域,分别存储着不同的代码片段。
基础版本
  • 最开始的版本是这样的,在A程序里面有一个0.1s定时器,到了时间后就执行跳转代码
  • 将PC设置为程序B的开始地址,然后程序B开始执行,他同时也设置了一个定时器,到了时间后就会继续跳转到A
升级版本
  • 在基础版本里面,只是多任务管理程序嵌入到了运行程序里面,这样不好。
  • 升级版本的操作是

30天自制操作系统 定时器相关推荐

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

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

  2. 索骥馆-DIY操作系统之《30天自制操作系统》扫描版[PDF]

    内容简介: <30天自制操作系统>是一本兼具趣味性.实用性与学习性的操作系统图书.作者从计算机的构造.汇编语言.C语言开始解说,让读者在实践中掌握算法.在这本书的指导下,从零编写所有代码, ...

  3. 【操作系统】30天自制操作系统--(14)多任务1

    本章开始多任务的设计. 一 多任务的说明 多任务(multitask),指的是操作系统中,多个应用程序同时运行的状态.然而,对于单核CPU来说,同一个瞬间只能处理一个事情,不能做到左右互搏.一心二用的 ...

  4. 《30天自制操作系统》U盘启动,真机运行(16天)

    首先说一下到目前为止U盘启动遇到的问题,首先的一个问题是"system volume information",目前尚未解决,这个问题可能导致U盘启动失败,我猜测可能是由于每一次重 ...

  5. 《30天自制操作系统》笔记(09)——绘制窗口

    <30天自制操作系统>笔记(09)--绘制窗口 进度回顾 上一篇中介绍了图层式窗口管理的思路和算法.在此基础上,本篇就解决绘制窗口及其简单的优化问题. 这里稍微吐槽一下<30天自制操 ...

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

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

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

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

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

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

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

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

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

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

最新文章

  1. python命令之m参数 局域网传输
  2. mysql substr 中文乱码_刚碰到的MySql乱码的问题
  3. 人工智能和自主系统在美军联合职能中的应用
  4. spring的xml配置文件出现故障
  5. DevExtreme 学习应用[1]
  6. Windows 环境 Tomcat 的 HTTPS 单向认证和双向认证的配置
  7. 单片机发送数据到mysql_单片机的数据怎样进入到sql server的数据库中
  8. Python练习 | Python中的strip()函数使用???(求解决方法)
  9. mysql insert 字符集_有关 MySQL 字符集的注意事项-爱可生
  10. poj 3256(DFS)
  11. 信息学奥赛一本通 2048:【例5.18】串排序
  12. 移动混合应用HTML5数据查询优化
  13. python从入门到放弃-《Python3从入门到放弃》视频教程
  14. 【运动学】基于matlab模拟布朗运动(可输入温度)【含Matlab源码 1610期】
  15. html中将字体设置成透明的,解决css设置背景透明,文字不透明_html/css_WEB-ITnose
  16. 【图像配准】基于sift算法实现图像配准matlab源码
  17. 【NS3】NS3安装 visualizer模块安装 (Windows+VMware+Kali) 2022.2
  18. 安装MS SQL Server2000“以前的某个程序安装已在安装计算机上创建挂起的文件操作”的解决办法
  19. Visio更改图形块的内边距
  20. 计算机的教育领域的应用研究,浅析计算机科学技术在现代教育中的应用研究

热门文章

  1. 莫比乌斯函数与莫比乌斯反演
  2. buf.indexOf()
  3. Python—字典(当索引不好用时)
  4. 一个关于finally和return的面试题
  5. 现代软件工程第五周作业
  6. csu 1578 Opening Ceremony (递推 )
  7. java第四章编程题(初学篇)
  8. MPLS virtual private network OptionA实验(华为设备)
  9. DHCPv4技术原理
  10. Kubernetes详解(十一)——标签与标签选择器