30天自制操作系统 定时器
文章目录
- 理解
- 原理
- 定时器优化
- 改为判断
- 增加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的运行
使用链表
- 以前的程序是使用数组,这样为了维持数组的有序,每次插入新的定时器,都需要重新移动数组元素。
- 当执行计时器中断程序的时候,直接重置头指针即可
- 简单来说,把原来存放活动定时器地址的数组设定成链表的形式。
- 这样当插入新的定时器的时候,会导致有四种情况
- 插入到最前面
- 插入到中间
- 插入到最后面
- 只有一个元素
- 岗哨,我们设置一个时间为0xffff,然后就会一直放置到链表的末尾
- 这样就会消除34两种情况
测试性能
- 在HariMain里面累加Count,查看10s时候的count值,在开机启动3s之后要重置count为0
- 因为电脑在启动时候的偏差会很大,所以在前3s的count值舍弃掉
技巧
- 在FIFO里面取代移位操作,读取一个数据以后不是让后面的数据向前靠齐,而是改变下一次的数据读取地址。但是并不适用于定时器。
多任务
- 对于多任务而言,是有两片内存区域,分别存储着不同的代码片段。
基础版本
- 最开始的版本是这样的,在A程序里面有一个0.1s定时器,到了时间后就执行跳转代码
- 将PC设置为程序B的开始地址,然后程序B开始执行,他同时也设置了一个定时器,到了时间后就会继续跳转到A
升级版本
- 在基础版本里面,只是多任务管理程序嵌入到了运行程序里面,这样不好。
- 升级版本的操作是
30天自制操作系统 定时器相关推荐
- 30天自制操作系统——第二十三天窗口操作
窗口及输入切换 我们先来实现用键盘切换窗口,按下F11键,将最下面的窗口移动到最上面,这里F11按键的编码为0x57. bootpack.c节选: void HariMain(void) {(略)fo ...
- 索骥馆-DIY操作系统之《30天自制操作系统》扫描版[PDF]
内容简介: <30天自制操作系统>是一本兼具趣味性.实用性与学习性的操作系统图书.作者从计算机的构造.汇编语言.C语言开始解说,让读者在实践中掌握算法.在这本书的指导下,从零编写所有代码, ...
- 【操作系统】30天自制操作系统--(14)多任务1
本章开始多任务的设计. 一 多任务的说明 多任务(multitask),指的是操作系统中,多个应用程序同时运行的状态.然而,对于单核CPU来说,同一个瞬间只能处理一个事情,不能做到左右互搏.一心二用的 ...
- 《30天自制操作系统》U盘启动,真机运行(16天)
首先说一下到目前为止U盘启动遇到的问题,首先的一个问题是"system volume information",目前尚未解决,这个问题可能导致U盘启动失败,我猜测可能是由于每一次重 ...
- 《30天自制操作系统》笔记(09)——绘制窗口
<30天自制操作系统>笔记(09)--绘制窗口 进度回顾 上一篇中介绍了图层式窗口管理的思路和算法.在此基础上,本篇就解决绘制窗口及其简单的优化问题. 这里稍微吐槽一下<30天自制操 ...
- 为什么《30天自制操作系统》封面中的猫是两只尾巴
刚刚在一社区,发了一贴,被指出一问题,询一高人,得一答案.这便是我没有关注到的封面上的那只猫,我想这也是很多读者没有关注到的.因为在我微博的200转发贴中,并没有人提到封面中的猫为何有两只尾巴.于是咨 ...
- 发布在《30天自制操作系统》之前的帮助阅读贴
说明:这是8月15日即将上市的一本新书,本文的摘选也可以命名为<30天自制操作系统>上市之前必读.本书幽默,有趣,可以说是技术书里的幽默书,让您读起来绝对不会感到乏味.在本书上市之前,您一 ...
- 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!
<30天自制操作系统>笔记(01)--hello bitzhuwei's OS! 最初的OS代码 1 ; hello-os 2 ; TAB=4 3 4 ORG 0x7c00 ; 指明程序的 ...
- 写在《30天自制操作系统》上市之前
这本<30天自制操作系统>马上就要在各大书店和网上商城全面上架了,作为本书的4位译者之一,我负责翻译了本书约三分之二的内容.这是我参与翻译的第一本译著,我感到很激动也很紧张,因为我知 ...
- 《30天自制操作系统》笔记(04)——显示器256色
<30天自制操作系统>笔记(04)--显示器256色 进度回顾 从最开始的(01)篇到上一篇为止,已经解决了开发环境问题和OS项目的顶层设计问题. 本篇做一个小练习:设置显卡显示256色. ...
最新文章
- python命令之m参数 局域网传输
- mysql substr 中文乱码_刚碰到的MySql乱码的问题
- 人工智能和自主系统在美军联合职能中的应用
- spring的xml配置文件出现故障
- DevExtreme 学习应用[1]
- Windows 环境 Tomcat 的 HTTPS 单向认证和双向认证的配置
- 单片机发送数据到mysql_单片机的数据怎样进入到sql server的数据库中
- Python练习 | Python中的strip()函数使用???(求解决方法)
- mysql insert 字符集_有关 MySQL 字符集的注意事项-爱可生
- poj 3256(DFS)
- 信息学奥赛一本通 2048:【例5.18】串排序
- 移动混合应用HTML5数据查询优化
- python从入门到放弃-《Python3从入门到放弃》视频教程
- 【运动学】基于matlab模拟布朗运动(可输入温度)【含Matlab源码 1610期】
- html中将字体设置成透明的,解决css设置背景透明,文字不透明_html/css_WEB-ITnose
- 【图像配准】基于sift算法实现图像配准matlab源码
- 【NS3】NS3安装 visualizer模块安装 (Windows+VMware+Kali) 2022.2
- 安装MS SQL Server2000“以前的某个程序安装已在安装计算机上创建挂起的文件操作”的解决办法
- Visio更改图形块的内边距
- 计算机的教育领域的应用研究,浅析计算机科学技术在现代教育中的应用研究