zoukankan      html  css  js  c++  java
  • 自制操作系统(七) 加快中断处理,和加入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 = 0;
        fifo->p = 0; 
        fifo->q = 0; 
        return;
    }

    向缓冲区传送数据:

    int fifo8_put(struct FIFO8 *fifo, unsigned char data)
    {
        if (fifo->free == 0) {
            fifo->flags |= FLAGS_OVERRUN;
            return -1;
        }
        fifo->buf[fifo->p] = data;
        fifo->p++;
        if (fifo->p == fifo->size) {
            fifo->p = 0;
        }
        fifo->free--;
        return 0;
    }

    从缓冲区取得数据:

    int fifo8_put(struct FIFO8 *fifo, unsigned char data)
    {
        if (fifo->free == 0) {
            fifo->flags |= FLAGS_OVERRUN;
            return -1;
        }
        fifo->buf[fifo->p] = data;
        fifo->p++;
        if (fifo->p == fifo->size) {
            fifo->p = 0;
        }
        fifo->free--;
        return 0;
    }

    获得当前缓冲区状况:

    int fifo8_status(struct FIFO8 *fifo)
    {
        return fifo->size - fifo->free;
    }

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

           ……………………
        for (;;) {
            io_cli();
            if (fifo8_status(&keyfifo) + fifo8_status(&mousefifo) == 0) {
                io_stihlt();
            } else {
                if (fifo8_status(&keyfifo) != 0) {
                    i = fifo8_get(&keyfifo);
                    io_sti();
                    sprintf(s, "%02X", i);
                    boxfill8(binfo->vram, binfo->scrnx, COL8_008484,  0, 16, 15, 31);
                    putfonts8_asc(binfo->vram, binfo->scrnx, 0, 16, COL8_FFFFFF, s);
                } else if (fifo8_status(&mousefifo) != 0) {
                    i = fifo8_get(&mousefifo);
                    io_sti();
                    sprintf(s, "%02X", i);
                    boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 32, 16, 47, 31);
                    putfonts8_asc(binfo->vram, binfo->scrnx, 32, 16, COL8_FFFFFF, s);
                }
            }
        }
  • 相关阅读:
    linux内核主要模块图
    进程的用户栈和内核栈
    Linux0.11内核几种地址(逻辑地址、线性地址、物理地址)的含义
    实模式与保护模式
    Linux多线程与同步
    java+selenium——鼠标左击
    java+selenium——键盘操作+复制粘贴(keys类)
    java+selenium——语法简介
    java+selenium——鼠标悬停从一个位置移动到另外一个位置
    java+selenium——简单截图+保存在java工程目录下=====简单截图+时间+保存在java工程目录下
  • 原文地址:https://www.cnblogs.com/rixiang/p/5529565.html
Copyright © 2011-2022 走看看