自制操作系统(七) 加快中断处理,和加入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);
            }
        }
    }

 

posted on 2016-05-26 07:56  J·Marcus  阅读(607)  评论(0编辑  收藏  举报

导航