参考书籍《30天自制操作系统》、《自己动手写操作系统》

2016-05-26、2016-07-09

主要是加快中断处理,和加入FIFO缓冲区。

因为之前是将打印字符的代码放在了中断函数中,这会造成一定的效率低下,因为当调用中断函数时便包含了打印字符操作,而这时来了新的中断的话(此时在打印之前的中断的相应字符)就会无法响应。对此,需要做的是,一方面将中断与中断对应要处理的事件分离,另一方面制作缓冲区。

缓冲区一方面是向里面添加,中断(每一次调用中断函数)。另一方面不断的读缓冲区里的中断(这个读操作放在C语言main函数的无限循环里)。

缓冲区要用到的数据结构:

  1. struct FIFO8 {
  2. unsigned char *buf;
  3. int p, q, size, free, flags;
  4. };

缓冲区大小为size

free用于保存缓冲区里没有数据的字节数

缓冲区地址buf

p代表下一个数据写入地址

q代表下一个数据读出地址

之后就是写一些函数封装对缓冲区的操作:

初始化缓冲区:

  1. void fifo8_init(struct FIFO8 *fifo, int size, unsigned char *buf)
  2. {
  3. fifo->size = size;
  4. fifo->buf = buf;
  5. fifo->free = size;
  6. fifo->flags = ;
  7. fifo->p = ;
  8. fifo->q = ;
  9. return;
  10. }

向缓冲区传送数据:

  1. int fifo8_put(struct FIFO8 *fifo, unsigned char data)
  2. {
  3. if (fifo->free == ) {
  4. fifo->flags |= FLAGS_OVERRUN;
  5. return -;
  6. }
  7. fifo->buf[fifo->p] = data;
  8. fifo->p++;
  9. if (fifo->p == fifo->size) {
  10. fifo->p = ;
  11. }
  12. fifo->free--;
  13. return ;
  14. }

从缓冲区取得数据:

  1. int fifo8_put(struct FIFO8 *fifo, unsigned char data)
  2. {
  3. if (fifo->free == ) {
  4. fifo->flags |= FLAGS_OVERRUN;
  5. return -;
  6. }
  7. fifo->buf[fifo->p] = data;
  8. fifo->p++;
  9. if (fifo->p == fifo->size) {
  10. fifo->p = ;
  11. }
  12. fifo->free--;
  13. return ;
  14. }

获得当前缓冲区状况:

  1. int fifo8_status(struct FIFO8 *fifo)
  2. {
  3. return fifo->size - fifo->free;
  4. }

C main函数要对缓冲区数据处理(上述函数封装了一些对缓冲区的操作):

  1. ……………………
  2. for (;;) {
  3. io_cli();
  4. if (fifo8_status(&keyfifo) + fifo8_status(&mousefifo) == ) {
  5. io_stihlt();
  6. } else {
  7. if (fifo8_status(&keyfifo) != ) {
  8. i = fifo8_get(&keyfifo);
  9. io_sti();
  10. sprintf(s, "%02X", i);
  11. boxfill8(binfo->vram, binfo->scrnx, COL8_008484, , , , );
  12. putfonts8_asc(binfo->vram, binfo->scrnx, , , COL8_FFFFFF, s);
  13. } else if (fifo8_status(&mousefifo) != ) {
  14. i = fifo8_get(&mousefifo);
  15. io_sti();
  16. sprintf(s, "%02X", i);
  17. boxfill8(binfo->vram, binfo->scrnx, COL8_008484, , , , );
  18. putfonts8_asc(binfo->vram, binfo->scrnx, , , COL8_FFFFFF, s);
  19. }
  20. }
  21. }

自制操作系统(七) 加快中断处理,和加入FIFO缓冲区的更多相关文章

  1. 单字节的FIFO缓存(30天自制操作系统--读书笔记)

    从今天起,写一些读书笔记.最近几个月都在看<30天自制操作系统这本书>,书虽说看的是电子书,但可以花钱买的正版书,既然花费了金钱,就总得有些收获. 任何人都不能总是固步自封,想要进步就得学 ...

  2. 《30天自制操作系统》12_day_学习笔记

    harib09a: 定时器:(Timer)每隔一段时间,会向CPU发送一个中断.这样CPU不用记住每一条指令的执行时间.没有定时器很多指令CPU都很难执行.例如HLT指令,这个指令的执行时间不是个固定 ...

  3. 《30天自制操作系统》笔记(06)——CPU的32位模式

    <30天自制操作系统>笔记(06)——CPU的32位模式 进度回顾 上一篇中实现了启用鼠标.键盘的功能.屏幕上会显示出用户按键.点击鼠标的情况.这是通过设置硬件的中断函数实现的,可以说硬件 ...

  4. 《30天自制操作系统》13_day_学习笔记

    harib10a: 简化字符串的显示:我们发现字符串显示三条语句总是重复出现,并且总是一起出现的.接下来我们把它归纳到一个函数中,这样便于使用. x,y--位置的坐标    c--字符颜色  (col ...

  5. 《30天自制操作系统》07_day_学习笔记

    harib04a: P126    获取按键编码: 让程序在按下键盘的键之后,将键值编码显示出来 修改的是前面编写的鼠标按键的处理键盘中断的函数inthandler21() 这里笔者介绍了怎样把中断号 ...

  6. 《30天自制操作系统》笔记(03)——使用Vmware

    <30天自制操作系统>笔记(03)——使用Vmware 进度回顾 在上一篇,实现了用IPL加载OS程序到内存,然后JMP到OS程序这一功能:并且总结出下一步的OS开发结构.但是遇到了真机测 ...

  7. 《30天自制操作系统》笔记(02)——导入C语言

    <30天自制操作系统>笔记(02)——导入C语言 进度回顾 在上一篇,记录了计算机开机时加载IPL程序(initial program loader,一个nas汇编程序)的情况,包括IPL ...

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

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

  9. 《30天自制操作系统》15_day_学习笔记

    harib12a: 这一部分我们来尝试两个任务的切换.下面我们一步一步的看: 1.定义TSS任务状态段(task statuc segment):定义的一种段,需要在GDT中定义使用 //TSS任务状 ...

随机推荐

  1. jQuery - 自定义伪类 [:pseudoclass]

    有两种创建伪类的方法, 第一种, $.extend( $.expr[':'], { // 自定义的伪类名称:group group: function(element, index, matches, ...

  2. AKI

    KDIGO 2012定义:尿量<0.5ml/kg/h 6h+:scr上升50%+ 7d-:scr上升26.5 2d- 但面对录入窗口,又想不出说什么了,继续看aki?刚才想的是什么呢?入冬,好像 ...

  3. 【Android UI】Android ListView详解

    在android开发中ListView是比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示.抽空把对ListView的使用做了整理,并写了个小例子,如下图. 列表的显示需要三 ...

  4. Windows Phone 8.1 新特性 - 控件之列表选择控件

    本篇我们来介绍Windows Phone 8.1 新特性中的列表选择控件. 在Windows Phone 8 时代,大家都会使用 LongListSelector 来实现列表选择控件,对数据进行分组显 ...

  5. 自定义struts实现

    一:struts2运行机制: Tomcat一启动,一些信息就已经加载完成,例如StrutsPrepareAndExecuteFilter加载的那些strut.xml以及Action的class类文件 ...

  6. 一种简单的实现:Android一键换肤功能

    现在的APP开发,通常会提供APP的换肤功能,网上流传的换肤代码和实现手段过于复杂,我把原作者的代码重新整理抽取出来,转换成Eclipse项目,重新整理成正确.可直接运行的项目. 代码运行结果如图. ...

  7. 针对Excel的vbs操作

    工程中具有导入Excel数据的功能,但是需要满足一定的格式.为了在导入之前,对Excel的格式进行规范,对vbs脚本语言进行了一定的了解,并实现了一个可以将Excel全部单元格设为文本格式的vbs脚本 ...

  8. Dom4j 对XMl解析 新手学习,欢迎高手指正

    废话不多,先看代码 public static void main(String args[]){ ReaderXml("d:/example.xml");//读取XML,传入XM ...

  9. linux-8 基本命令---date

    2,date命令用于显示.设置系统的时间或日期,格式如下: date[选项][+指定格式]. date的详细格式如下: date命令格式 参数 作用 %t 跳个[tab]键 %H 小时(00-23) ...

  10. segmentControl实现控制器的切换

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launc ...