自制操作系统(七) 加快中断处理,和加入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任务状 ...
随机推荐
- jQuery - 自定义伪类 [:pseudoclass]
有两种创建伪类的方法, 第一种, $.extend( $.expr[':'], { // 自定义的伪类名称:group group: function(element, index, matches, ...
- AKI
KDIGO 2012定义:尿量<0.5ml/kg/h 6h+:scr上升50%+ 7d-:scr上升26.5 2d- 但面对录入窗口,又想不出说什么了,继续看aki?刚才想的是什么呢?入冬,好像 ...
- 【Android UI】Android ListView详解
在android开发中ListView是比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示.抽空把对ListView的使用做了整理,并写了个小例子,如下图. 列表的显示需要三 ...
- Windows Phone 8.1 新特性 - 控件之列表选择控件
本篇我们来介绍Windows Phone 8.1 新特性中的列表选择控件. 在Windows Phone 8 时代,大家都会使用 LongListSelector 来实现列表选择控件,对数据进行分组显 ...
- 自定义struts实现
一:struts2运行机制: Tomcat一启动,一些信息就已经加载完成,例如StrutsPrepareAndExecuteFilter加载的那些strut.xml以及Action的class类文件 ...
- 一种简单的实现:Android一键换肤功能
现在的APP开发,通常会提供APP的换肤功能,网上流传的换肤代码和实现手段过于复杂,我把原作者的代码重新整理抽取出来,转换成Eclipse项目,重新整理成正确.可直接运行的项目. 代码运行结果如图. ...
- 针对Excel的vbs操作
工程中具有导入Excel数据的功能,但是需要满足一定的格式.为了在导入之前,对Excel的格式进行规范,对vbs脚本语言进行了一定的了解,并实现了一个可以将Excel全部单元格设为文本格式的vbs脚本 ...
- Dom4j 对XMl解析 新手学习,欢迎高手指正
废话不多,先看代码 public static void main(String args[]){ ReaderXml("d:/example.xml");//读取XML,传入XM ...
- linux-8 基本命令---date
2,date命令用于显示.设置系统的时间或日期,格式如下: date[选项][+指定格式]. date的详细格式如下: date命令格式 参数 作用 %t 跳个[tab]键 %H 小时(00-23) ...
- segmentControl实现控制器的切换
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launc ...