自制操作系统(七) 加快中断处理,和加入FIFO缓冲区
参考书籍《30天自制操作系统》、《自己动手写操作系统》
2016-05-26、2016-07-09
主要是加快中断处理,和加入FIFO缓冲区。
因为之前是将打印字符的代码放在了中断函数中,这会造成一定的效率低下,因为当调用中断函数时便包含了打印字符操作,而这时来了新的中断的话(此时在打印之前的中断的相应字符)就会无法响应。对此,需要做的是,一方面将中断与中断对应要处理的事件分离,另一方面制作缓冲区。
缓冲区一方面是向里面添加,中断(每一次调用中断函数)。另一方面不断的读缓冲区里的中断(这个读操作放在C语言main函数的无限循环里)。
缓冲区要用到的数据结构:
struct FIFO8 {
unsigned char *buf;
int p, q, size, free, flags;
};
缓冲区大小为size
free用于保存缓冲区里没有数据的字节数
缓冲区地址buf
p代表下一个数据写入地址
q代表下一个数据读出地址
之后就是写一些函数封装对缓冲区的操作:
初始化缓冲区:
void fifo8_init(struct FIFO8 *fifo, int size, unsigned char *buf)
{
fifo->size = size;
fifo->buf = buf;
fifo->free = size;
fifo->flags = ;
fifo->p = ;
fifo->q = ;
return;
}
向缓冲区传送数据:
int fifo8_put(struct FIFO8 *fifo, unsigned char data)
{
if (fifo->free == ) {
fifo->flags |= FLAGS_OVERRUN;
return -;
}
fifo->buf[fifo->p] = data;
fifo->p++;
if (fifo->p == fifo->size) {
fifo->p = ;
}
fifo->free--;
return ;
}
从缓冲区取得数据:
int fifo8_put(struct FIFO8 *fifo, unsigned char data)
{
if (fifo->free == ) {
fifo->flags |= FLAGS_OVERRUN;
return -;
}
fifo->buf[fifo->p] = data;
fifo->p++;
if (fifo->p == fifo->size) {
fifo->p = ;
}
fifo->free--;
return ;
}
获得当前缓冲区状况:
int fifo8_status(struct FIFO8 *fifo)
{
return fifo->size - fifo->free;
}
C main函数要对缓冲区数据处理(上述函数封装了一些对缓冲区的操作):
……………………
for (;;) {
io_cli();
if (fifo8_status(&keyfifo) + fifo8_status(&mousefifo) == ) {
io_stihlt();
} else {
if (fifo8_status(&keyfifo) != ) {
i = fifo8_get(&keyfifo);
io_sti();
sprintf(s, "%02X", i);
boxfill8(binfo->vram, binfo->scrnx, COL8_008484, , , , );
putfonts8_asc(binfo->vram, binfo->scrnx, , , COL8_FFFFFF, s);
} else if (fifo8_status(&mousefifo) != ) {
i = fifo8_get(&mousefifo);
io_sti();
sprintf(s, "%02X", i);
boxfill8(binfo->vram, binfo->scrnx, COL8_008484, , , , );
putfonts8_asc(binfo->vram, binfo->scrnx, , , COL8_FFFFFF, s);
}
}
}
自制操作系统(七) 加快中断处理,和加入FIFO缓冲区的更多相关文章
- 单字节的FIFO缓存(30天自制操作系统--读书笔记)
从今天起,写一些读书笔记.最近几个月都在看<30天自制操作系统这本书>,书虽说看的是电子书,但可以花钱买的正版书,既然花费了金钱,就总得有些收获. 任何人都不能总是固步自封,想要进步就得学 ...
- 《30天自制操作系统》12_day_学习笔记
harib09a: 定时器:(Timer)每隔一段时间,会向CPU发送一个中断.这样CPU不用记住每一条指令的执行时间.没有定时器很多指令CPU都很难执行.例如HLT指令,这个指令的执行时间不是个固定 ...
- 《30天自制操作系统》笔记(06)——CPU的32位模式
<30天自制操作系统>笔记(06)——CPU的32位模式 进度回顾 上一篇中实现了启用鼠标.键盘的功能.屏幕上会显示出用户按键.点击鼠标的情况.这是通过设置硬件的中断函数实现的,可以说硬件 ...
- 《30天自制操作系统》13_day_学习笔记
harib10a: 简化字符串的显示:我们发现字符串显示三条语句总是重复出现,并且总是一起出现的.接下来我们把它归纳到一个函数中,这样便于使用. x,y--位置的坐标 c--字符颜色 (col ...
- 《30天自制操作系统》07_day_学习笔记
harib04a: P126 获取按键编码: 让程序在按下键盘的键之后,将键值编码显示出来 修改的是前面编写的鼠标按键的处理键盘中断的函数inthandler21() 这里笔者介绍了怎样把中断号 ...
- 《30天自制操作系统》笔记(03)——使用Vmware
<30天自制操作系统>笔记(03)——使用Vmware 进度回顾 在上一篇,实现了用IPL加载OS程序到内存,然后JMP到OS程序这一功能:并且总结出下一步的OS开发结构.但是遇到了真机测 ...
- 《30天自制操作系统》笔记(02)——导入C语言
<30天自制操作系统>笔记(02)——导入C语言 进度回顾 在上一篇,记录了计算机开机时加载IPL程序(initial program loader,一个nas汇编程序)的情况,包括IPL ...
- 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!
<30天自制操作系统>笔记(01)——hello bitzhuwei's OS! 最初的OS代码 ; hello-os ; TAB=4 ORG 0x7c00 ; 指明程序的装载地址 ; 以 ...
- 《30天自制操作系统》15_day_学习笔记
harib12a: 这一部分我们来尝试两个任务的切换.下面我们一步一步的看: 1.定义TSS任务状态段(task statuc segment):定义的一种段,需要在GDT中定义使用 //TSS任务状 ...
随机推荐
- hdu 5976 Detachment
Detachment Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- 【洛谷P3076】Taxi
这道题值得好好想一会 我们通过对一些小数据的手算,以及对于每段路程的拆分,可以发现: 1.每个st对应的ed这段路程无论如何都要算上 2.额外还要计算的一段路程,就是"切换"费用 ...
- IE全屏浏览代码
以前做过一个网络版的商场导购触摸屏系统,用ASP写的,就是要在运行的时候全屏浏览而不能出现标题栏.工具栏.状态栏等.解决方法是用JS弹出全屏窗口,建立html文件,代码如下: <script l ...
- 一些比较常用的Linux命令
我有一些是我是参考别人的,忘记是谁了,在这里要感谢一下ta. #命令格式就是就是由命令+空格+一些命令用法的选项(可以选择多个用法)+空格+/+目录名或者文件名,有些是直接打命令就可以了,比如ls - ...
- label下面放置select的问题
今天做项目的时候突然发现一个问题. html标签label的用法分两种: <label for="name">姓名:</label><input id ...
- 天气预报API(五):城市代码--“新编码”和“旧编码” 对比
参考一些博客.文章 来查找 测试 接口,后来发现两套城市编码标准,有点想法,故拿来对比分析. 注:新旧编码是个人主观叫法,只是为了方便称呼,可能有不当之处,请留言更正. 暂且称 中国天气网等网站使用的 ...
- 【转】Python中的赋值、浅拷贝、深拷贝介绍
这篇文章主要介绍了Python中的赋值.浅拷贝.深拷贝介绍,Python中也分为简单赋值.浅拷贝.深拷贝这几种"拷贝"方式,需要的朋友可以参考下 和很多语言一样,Python中 ...
- Changing the Color of Linux ls Command 改变Linux的ls命令显示的颜色
Linux command ls basically use the file /etc/DIR_COLORS or /etc/DIR_COLORS.xterm to define the color ...
- IOS绘制渐变背景色折线图的一种尝试
1.绘制折线图 上次在群里看到一个折线图划的很漂亮,自己想实现一个这样的 ,但是一直没什么头绪,不知道怎么做,就开始在网上查找划线,绘 制渐变色这一块的内容,用最笨的方式,自己尝试的写了一些,也没 有 ...
- js实现单文件以及多文件下载
<script type="text/javascript"> /** * Javascript 多文件下载 * @author Barret Lee * @email ...