您的位置:首页 > 其它

自制操作系统(七) 加快中断处理,和加入FIFO缓冲区

2016-05-26 07:56 405 查看
参考书籍《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);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: